10

dbWriteTable関数はRPostgreSQL列名を無視しているようで、R から PostgreSQL にデータをそのままプッシュしようとします。これは、既存のテーブルに追加するときに問題になります。特に、デフォルト値を指定する必要がある R オブジェクトに指定されていない列がある場合はそうです。

RMySQL は、カラム名を に追加することで、このケースを非常に適切に処理しますLOAD DATA LOCAL INFILEdbWriteTablewhenで指定されていない列にデフォルト値を割り当てるように 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

次の場合にのみ失敗します。

  1. デフォルト値のない列の指定に失敗しました
  2. テーブルに存在しない列を挿入しようとしています
  3. 既存の列に間違ったデータ型を挿入します
4

1 に答える 1

7

私はまったく同じ問題を抱えていましたが、これで修正されました。

dbWriteTable2パッケージから関数をチェックアウトしますcaroline

次に、コードを使用して、id 列のないデータ フレームをデータベースに書き込むことができますadd_id = TRUE

dbWriteTable2(con_psql,"domains",data_domains,append=TRUE,overwrite=FALSE,row.names=FALSE,add.id=TRUE)
于 2014-05-20T05:32:55.633 に答える