如何在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)