我有一个在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
列自动生成?
dbWriteTable
正在发出COPY
, 但没有办法指定字段名称(这就导致了问题)。在dbWriteTable
中只有不足够的智能来查看是否有一个SERIAL
字段。caroline
中的dbWriteTable2
有一个hack-ish解决方法(通过使用自己的表格id
字段)。我可能会选择制作一个使用带有字段名称的COPY
版本。 - hrbrmstr