如何在RPostgreSQL中对dbWriteTable(…,append=TRUE)使用列默认值
如何在RPostgreSQL中对dbWriteTable(…,append=TRUE)使用列默认值,r,postgresql,rpostgresql,R,Postgresql,Rpostgresql,RPostgreSQL中的dbWriteTable函数似乎忽略了列名,并试图按原样将数据从R推送到PostgreSQL。当追加到现有表时,这是有问题的,特别是当R对象中有未指定的列应该被赋予默认值时 通过将列名添加到LOAD DATA LOCAL infle,RMySQL非常优雅地处理了这种情况。当append=TRUE时,如何强制RPostgreSQL将默认值分配给dbWriteTable中未指定的列 以下是一个例子: CREATE TABLE test ( column_a varc
RPostgreSQL
中的dbWriteTable
函数似乎忽略了列名,并试图按原样将数据从R推送到PostgreSQL。当追加到现有表时,这是有问题的,特别是当R对象中有未指定的列应该被赋予默认值时
通过将列名添加到LOAD DATA LOCAL infle
,RMySQL非常优雅地处理了这种情况。当append=TRUE
时,如何强制RPostgreSQL将默认值分配给dbWriteTable
中未指定的列
以下是一个例子:
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)
这是因为我没有指定column\u a
字段,所以dbWriteTable
正在尝试将column\u b的数据写入column\u a。我想强制dbWriteTable
使用列a
的默认值,并将列b
正确写入列b
只有在以下情况下,我才会失败:
我有完全相同的问题,这解决了它 从软件包中查看
dbWriteTable2
函数
然后,代码允许您使用add_id=TRUE
将没有id列的数据帧写入数据库,例如
dbWriteTable2(con_psql,"domains",data_domains,append=TRUE,overwrite=FALSE,row.names=FALSE,add.id=TRUE)
如果您编写了一个创建表的小示例,然后尝试向其追加内容却未成功,则会有所帮助。@nograps done。请参阅已编辑的问题。当您使用
x时会发生什么?这在RPostgres()中已修复@hadley感谢您编写此软件包!请将您的评论作为答案发表,因为这是解决我问题的最佳方法。它是否将列名添加到insert语句中,以使它们不必处于相同的顺序?当我使用它时,我的数据框中有相同顺序的匹配列名。在我的数据框中,我只遗漏了id
。新测试:以随机顺序写入列+额外列。这一切都起了作用,它甚至很好地处理了额外的列:“找到”url“不在“排名”表的字段中。省略。`事实上,如果数据框中缺少一列,此函数似乎只是将NULL
写入数据库。太棒了。我得去看看。谢谢
dbWriteTable2(con_psql,"domains",data_domains,append=TRUE,overwrite=FALSE,row.names=FALSE,add.id=TRUE)