我正在尝试使用 RPostgreSQL
将数据插入到预先存在的 PostgreSQL 表中,但我无法弄清楚 SQL 参数(准备好的语句)的语法。
例如假设我想做以下事情
插入 mytable (a,b,c) 值 ($1,$2,$3)
如何指定参数? dbSendQuery
直接把参数放在...
好像不太明白。
我发现 dbWriteTable
可用于转储整个表,但不允许您指定列(因此不适合默认值等)。无论如何,一旦我在其中获取数据,我就需要知道其他查询的这一点(所以我想这并不是真正的插入特定的)!
当然,我只是遗漏了一些明显的东西......
最佳答案
出于同样的原因,我一直在寻找同样的东西,那就是安全性。
显然 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')
现在将查询放在一起感觉安全多了。
关于sql - 如何在 RPostgreSQL 中使用参数(插入数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20201221/