sql - 如何在 RPostgreSQL 中使用参数(插入数据)

标签 sql r postgresql rpostgresql

我正在尝试使用 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/

相关文章:

javascript - 选择 Shiny 的目录

r - 在 ggplot 中获取刻度中断位置

postgresql - 有没有办法继承当前用户不拥有的表

ruby-on-rails - Elasticsearch、Chewy、Postgres 和 Apartment Multi-Tenancy

c# - 无法使用 Ole Db 提供程序通过 C# 找到 postgres 数据库

mysql - 按父 ID 删除 SQL 树

java - 使用 MyBatis 将集合持久化到对象中

sql - 将返回随机记录的 PostgreSQL 过程

sql - Oracle SQL : NOLOCK in join statment

r - 如何使用 ggplot2 控制绘图的尺寸/大小