のdbWriteTable
関数はRPostgreSQL
列名を無視しているようで、R から PostgreSQL にデータをそのままプッシュしようとします。これは、既存のテーブルに追加するときに問題になります。特に、デフォルト値を指定する必要がある R オブジェクトに指定されていない列がある場合はそうです。
RMySQL は、カラム名を に追加することで、このケースを非常に適切に処理しますLOAD DATA LOCAL INFILE
。dbWriteTable
whenで指定されていない列にデフォルト値を割り当てるように 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
。
次の場合にのみ失敗します。
- デフォルト値のない列の指定に失敗しました
- テーブルに存在しない列を挿入しようとしています
- 既存の列に間違ったデータ型を挿入します