出于同样的原因,我一直在寻找同样的东西,那就是安全。
显然 dplyr 包具有您感兴趣的容量。它几乎没有记录,但它就在那里。在这个小插图中向下滚动到“Postgresql”:http: //cran.r-project.org/web/packages/dplyr/vignettes/databases.html
总而言之,dplyr 提供了函数 sql() 和 escape(),它们可以结合起来产生一个参数化的查询。DBI 包中的 SQL() 函数似乎以完全相同的方式工作。
> sql(paste0('SELECT * FROM blaah WHERE id = ', escape('random "\'stuff')))
<SQL> SELECT * FROM blaah WHERE id = 'random "''stuff'
它返回类“sql”和“character”的对象,因此您可以将其传递给 tbl() 或可能也传递给 dbSendQuery()。
escape() 函数也可以正确处理向量,我认为这最有用:
> sql(paste0('SELECT * FROM blaah WHERE id in ', escape(1:5)))
<SQL> SELECT * FROM blaah WHERE id in (1, 2, 3, 4, 5)
同样自然也适用于变量:
> tmp <- c("asd", 2, date())
> sql(paste0('SELECT * FROM blaah WHERE id in ', escape(tmp)))
<SQL> SELECT * FROM blaah WHERE id in ('asd', '2', 'Tue Nov 18 15:19:08 2014')
我现在把查询放在一起感觉更安全。