微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用自动增量主键将数据从R写入PostgreSQL表?

我在Postgresql数据库中有一个表,它有一个BIGSERIAL自动递增主键.使用以下方法重新创建
CREATE TABLE foo
(
  "Id" bigserial PRIMARY KEY,"SomeData" text NOT NULL
);

我想通过RPostgresql包从R向该表附加一些数据.在R中,数据不包括Id列,因为我希望数据库生成这些值.

dfr <- data.frame(SomeData = letters)

这是我用来尝试编写数据的代码

library(RPostgresql)
conn <- dbConnect(
  "Postgresql",user     = "yourname",password = "your password",dbname   = "test"
)
dbWriteTable(conn,"foo",dfr,append = TRUE,row.names = FALSE)
dbdisconnect(conn)

不幸的是,dbWriteTable抛出一个错误

## Error in postgresqlgetResult(new.con) : 
##   RS-DBI driver: (Could not Retrieve the result : ERROR:  invalid input Syntax for integer: "a"
## CONTEXT:  copY foo,line 1,column Id: "a"
## )

错误消息并不完全清楚,但我将其解释为R试图将SomeData列的内容传递给数据库中的第一列(即Id).

我应该如何将数据传递给Postgresql,以便自动生成Id列?

从hrbrmstr评论中的帖子中,我找到了 a hack来完成这项工作.

在RPostgresql包中的postgresqlWriteTable中,您需要替换该行

sql4 <- paste("copY",postgresqlTableRef(name),"FROM STDIN")

sql4 <- paste(
  "copY ","(",paste(postgresqlQuoteId(names(value)),collapse = ","),") FROM STDIN"
)

请注意,引用变量(未包含在原始hack中)对于传递区分大小写的列名称是必需的.

这是一个脚本:

body_lines <- deparse(body(RPostgresql::postgresqlWriteTable))
new_body_lines <- sub(
  'postgresqlTableRef(name),"FROM STDIN")','postgresqlTableRef(name),paste(shQuote(names(value)),") FROM STDIN")',body_lines,fixed = TRUE
)
fn <- RPostgresql::postgresqlWriteTable
body(fn) <- parse(text = new_body_lines)
while("RPostgresql" %in% search()) detach("package:RPostgresql")
assignInNamespace("postgresqlWriteTable",fn,"RPostgresql")

原文地址:https://www.jb51.cc/postgresql/192764.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐