如何使用自动增量主键将数据从R写入PostgreSQL表?
发布时间:2020-12-13 16:29:46 所属栏目:百科 来源:网络整理
导读:我在PostgreSQL数据库中有一个表,它有一个BIGSERIAL自动递增主键.使用以下方法重新创建 CREATE TABLE foo( "Id" bigserial PRIMARY KEY,"SomeData" text NOT NULL); 我想通过RPostgreSQL包从R向该表附加一些数据.在R中,数据不包括Id列,因为我希望数据库生成
我在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") (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |