2

我的 R 工作流程现在涉及处理大量查询(RPostgreSQL库)。我真的想让代码在未来易于维护和管理。

.SQL我开始从单独的文件中加载大型查询(很有帮助)并且效果很好。

然后我开始使用插值(这有帮助),这意味着我可以写

SELECT * FROM table WHERE value = ?my_value;

并且(在将其加载到 R 之后)使用sqlInterpolate(ANSI(), query, value = "stackoverflow").

现在发生的事情是我想使用这样的东西

SELECT count(*) FROM ?my_table;

但我怎样才能让它工作呢?sqlInterpolate()默认情况下仅安全插值。有解决方法吗?

谢谢

4

2 回答 2

1

?DBI::SQL中,您可以阅读:

默认情况下,任何用户提供的查询输入都应该使用dbQuoteIdentifier()或者dbQuoteString()取决于它是指表还是变量名,或者是文字字符串来转义。

此外,在此页面上

dbQuoteIdentifier()如果您正在创建表或依赖用户输入来选择要过滤的列,您可能还需要。

所以你可以使用:

sqlInterpolate(ANSI(), 
               "SELECT count(*) FROM ?my_table", 
               my_table = dbQuoteIdentifier(ANSI(), "table_name"))
# <SQL> SELECT count(*) FROM "table_name"
于 2017-08-25T11:28:07.953 回答
0

sqlInterpolate()仅用于替换值,而不是表名等其他组件。您可以使用其他模板框架,例如brewwhisker

于 2017-04-13T14:22:12.657 回答