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

如何在RPostgreSQL中使用参数(插入数据),sql,r,postgresql,rpostgresql,Sql,R,Postgresql,Rpostgresql,我试图使用RPostgreSQL将数据插入到预先存在的PostgreSQL表中,但我无法理解SQL语句的语法 假设我想做以下事情 在mytable a、b、c中插入值$1、$2、$3 如何指定参数?dbSendQuery似乎不理解是否将参数放在 我发现dbWriteTable可以用来转储整个表,但不允许您指定列,因此不适用于默认值等。。不管怎样,一旦我得到了数据,我就需要知道其他查询的情况,所以我想这并不是插入特定的 当然,我只是遗漏了一些明显的东西…出于同样的原因,我也在寻找同样的东西,那就是

我试图使用RPostgreSQL将数据插入到预先存在的PostgreSQL表中,但我无法理解SQL语句的语法

假设我想做以下事情

在mytable a、b、c中插入值$1、$2、$3

如何指定参数?dbSendQuery似乎不理解是否将参数放在

我发现dbWriteTable可以用来转储整个表,但不允许您指定列,因此不适用于默认值等。。不管怎样,一旦我得到了数据,我就需要知道其他查询的情况,所以我想这并不是插入特定的


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

出于同样的原因,我也在寻找同样的东西,那就是安全性

显然,dplyr包具有您感兴趣的容量。几乎没有记录,但它就在那里。在此小插曲中向下滚动到Postgresql:

总之,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')
我觉得现在把查询放在一起更安全。

从最新的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 | ' "))

这是一个使用DBI和RPostgres包的版本,并且一次插入多行,因为这些年之后,从文档中仍然很难理解

x <- data.frame(
  a = c(1:10),
  b = letters[1:10],
  c = letters[11:20]
)

# insert your own connection info
con <- DBI::dbConnect(
  RPostgres::Postgres(),
  dbname = '', 
  host = '', 
  port = 5432, 
  user = '',
  password = ''
)

RPostgres::dbSendQuery(
  con, 
  "INSERT INTO mytable (a,b,c) VALUES ($1,$2,$3);",
  list(
    x$a,
    x$b,
    x$c
  )
)
DBI包中的dbBind帮助是解释如何格式化参数的唯一地方:

DBI当前未指定占位符格式;在 将来,可能会支持统一的占位符语法。咨询 支持格式的后端文档。。。。已知的例子有:

? RMySQL和RSQLite中按外观顺序的位置匹配 RPostgres和RSQLite中按索引的$1位置匹配 :名称和$name在RSQLite中命名匹配
??也是R包RJDBC的占位符。

[这个答案有用吗][1]?这个问题似乎与那里提出的问题相似。[1] :@JoeLove我想,但我不能100%确定这是RSQLite特有的。@joran,是的,这是错误的删除了它。我的意思有点相反:R是一种统计语言,如果对db功能与通用语言相比较弱感到不安,那就错了。就像你在c中不会期望glm一样。例如:这不是R的错,我在工作中使用了错误的工具。@Corone是的,我实际上同意一般的评估。R的很多数据库功能都是基于这样一种理念设计的,即数据总是单向的,从数据库到R进行分析,我认为。你也可以使用新的数据库,它完全支持参数化查询Thank@hadley。有关于参数化零件的例子吗?几天前我写了一篇关于大型插件性能的文章,我想比较一下这些软件包。还没有,但我正在为下周的Rstudio博客写一篇博文。请注意,参数化插入对于Postgre来说速度很慢,因此RPostgres中的dbWriteTable使用了不同的加载填充策略。我想,问题是关于向特定列插入/附加/更新数据。我无法实现类似的功能,至少在dbGetQuery中是这样。你能提供更详细的资料来源吗?