sqlAppendTable 和 dbExecute 有效,但 dbAppendTable 无效。为什么?

cmo*_*cmo 7 postgresql r r-dbi

我有一个 data.frame,我试图在R使用该DBI包时将其附加到 PostgreSQL 数据库中的表中。

library(DBI)
library(RPostgreSQL)

mydrv  <-  dbDriver(drvName = "PostgreSQL")
mydbcon  <-  dbConnect(drv = mydrv , host = myhostname , dbname = mydbname , username = myusername , password = mypassword  )
Run Code Online (Sandbox Code Playgroud)

如果我尝试这样做dbAppendTable,它会失败并显示一条奇怪的错误消息:

dbAppendTable( conn = mydbcon , name = mytable , value = mydata )
Run Code Online (Sandbox Code Playgroud)

postgresqlExecStatement(conn, statement, ...) 中的错误:RS-DBI 驱动程序:(无法检索结果:错误:“,”处或附近的语法错误第 4 行:(?, ?, ?, ?, ?, ? , ?, ?, ?, ?, ?, ?)

但是如果我用sqlAppendTableand分两步做dbExecute,那么它工作正常:

append_cmd  <-  sqlAppendTable( con = mydbcon , table = mytable , values = mydata , row.names = FALSE )
dbExecute( conn = mydbcon , statement = append_cmd )
Run Code Online (Sandbox Code Playgroud)

的文档dbAppendTable说:

dbAppendTable() 方法假定表已经预先创建,例如使用 dbCreateTable()。默认实现调用 sqlAppendTableTemplate(),然后使用 param 参数调用 dbExecute()。符合 ANSI SQL 99 的后端使用什么?作为准备查询的占位符不需要覆盖它。具有不同 SQL 语法的后端使用 ? 作为准备查询的占位符可以覆盖 sqlAppendTable()。其他后端(使用不同的占位符或使用完全不同的方式创建表)需要覆盖 dbAppendTable() 方法。

关于'?'占位符的部分似乎相关,但我不明白它是如何适应的。为什么 PostgreSQL 不满足这一点?为什么我必须分两步做才能让它工作?