如何使用RPostgreSQL参数(插入数据)

Cor*_*one 9 sql postgresql r rpostgresql

我正在尝试将数据插入到预先存在的PostgreSQL表中RPostgreSQL,我无法弄清楚SQL参数的语法(预处理语句).

例如,假设我想要做以下事情

insert into mytable (a,b,c) values ($1,$2,$3)

如何指定参数? dbSendQuery如果你只是把参数放在中,似乎不明白....

我发现dbWriteTable可以用来转储整个表,但是不允许你指定列(因此对默认值没有好处等).无论如何,一旦我获得了数据,我就需要知道其他查询(所以我认为这不是真正的插入特定的)!

当然,我只是遗漏了一些明显的东西......

Lau*_*riK 6

出于同样的原因,我一直在寻找同样的东西,这就是安全性.

显然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'
Run Code Online (Sandbox Code Playgroud)

它返回类"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)
Run Code Online (Sandbox Code Playgroud)

同样自然也适用于变量:

> 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')
Run Code Online (Sandbox Code Playgroud)

我现在把查询放在一起感觉更安全.

  • 您还可以使用新的https://github.com/rstats-db/RPostgres,它完全支持参数化查询 (2认同)

Nie*_*ian 6

截至最新,RPostgreSQL它应该有效:

db_connection <- dbConnect(dbDriver("PostgreSQL"), dbname = database_name,
                   host = "localhost", port = database_port, password=database_user_password,
                   user = database_user)
qry = "insert into mytable (a,b,c) values ($1,$2,$3)"
dbSendQuery(db_connection, qry, c(1, "some string", "some string with | ' "))
Run Code Online (Sandbox Code Playgroud)