dbWriteTable
中的RPostgreSQL
函数似乎忽略了列名,并尝试按原样将数据从R推送到PostgreSQL。当附加到现有表时,这是有问题的,特别是如果在R对象中未指定的列应该给出默认值。
RMySQL通过将列名添加到LOAD DATA LOCAL INFILE
来非常优雅地处理这种情况。当dbWriteTable
时,如何强制RPostgreSQL为append=TRUE
中未指定的列分配默认值?
以下是一个例子:
CREATE TABLE test (
column_a varchar(255) not null default 'hello',
column_b integer not null
);
insert into test values (DEFAULT, 1);
产生下表:
select * from test;
column_a | column_b
----------+----------
hello | 1
(1 row)
我想从R:
向此表插入一些新数据require('RPostgreSQL')
driver <- PostgreSQL()
con <- dbConnect(driver, host='localhost', dbname='development')
set.seed(42)
x <- data.frame(column_b=sample(1:100, 10))
dbWriteTable(con, name='test', value=x, append=TRUE, row.names=FALSE)
dbDisconnect(con)
但是我收到以下错误:
Error in postgresqlgetResult(new.con) :
RS-DBI driver: (could not Retrieve the result : ERROR: missing data for
column "column_b"
CONTEXT: COPY test, line 1: "92"
)
这是因为我没有指定column_a
字段,因此dbWriteTable
正在尝试将column_b的数据写入column_a。我想强制dbWriteTable
使用column_a
的默认值,并将column_b
正确写入column_b
。
我应该只在以下情况下失败:
答案 0 :(得分:7)
我有完全相同的问题,这解决了它。
查看包caroline
中的dbWriteTable2
功能。
然后,代码允许您使用add_id = TRUE
将没有id列的数据帧写入数据库,例如
dbWriteTable2(con_psql,"domains",data_domains,append=TRUE,overwrite=FALSE,row.names=FALSE,add.id=TRUE)