わかりました。なぜdbWriteTable()
なのかわかりません。 失敗するでしょう。ある種のバージョン/プロトコルの不一致がある可能性があります。可能であれば、Rの最新バージョンであるRPostgreSQLパッケージをインストールし、システムにPostgreSQLサーバーをアップグレードしてみてください。
insert into
について 大量のデータの回避策が失敗する場合、大量のデータを移動する必要があり、ワンショット転送が実行不可能/非現実的/不安定な場合にITの世界でよく行われることは、バッチ処理と呼ばれることもあります。 または
ランダムな例として、数年前、一度に1000レコードしか提供しないように制約されたHRLDAPサーバーから従業員情報を照会するJavaコードを作成しました。したがって、基本的に、同じリクエストを送信し続けるためにループを作成する必要がありました(ある種の奇妙なCookieベースのメカニズム )サーバーがクエリの完了を報告するまで、レコードをローカルデータベースに蓄積します。
これは、SQLを手動で作成して、指定されたdata.frameに基づいて空のテーブルを作成し、パラメーター化されたバッチサイズを使用してdata.frameのコンテンツをテーブルに挿入するコードです。これは主にpaste()
の呼び出しを中心に構築されています SQL文字列を作成するには、dbSendQuery()
実際のクエリを送信します。 postgresqlDataType()
も使用します テーブル作成用。
## connect to the DB
library('RPostgreSQL'); ## loads DBI automatically
drv <- dbDriver('PostgreSQL');
con <- dbConnect(drv,host=...,port=...,dbname=...,user=...,password=...);
## define helper functions
createEmptyTable <- function(con,tn,df) {
sql <- paste0("create table \"",tn,"\" (",paste0(collapse=',','"',names(df),'" ',sapply(df[0,],postgresqlDataType)),");");
dbSendQuery(con,sql);
invisible();
};
insertBatch <- function(con,tn,df,size=100L) {
if (nrow(df)==0L) return(invisible());
cnt <- (nrow(df)-1L)%/%size+1L;
for (i in seq(0L,len=cnt)) {
sql <- paste0("insert into \"",tn,"\" values (",do.call(paste,c(sep=',',collapse='),(',lapply(df[seq(i*size+1L,min(nrow(df),(i+1L)*size)),],shQuote))),");");
dbSendQuery(con,sql);
};
invisible();
};
## generate test data
NC <- 1e2L; NR <- 1e3L; df <- as.data.frame(replicate(NC,runif(NR)));
## run it
tn <- 't1';
dbRemoveTable(con,tn);
createEmptyTable(con,tn,df);
insertBatch(con,tn,df);
res <- dbReadTable(con,tn);
all.equal(df,res);
## [1] TRUE
row.names
の前にわざわざ追加しなかったことに注意してください dbWriteTable()
とは異なり、データベーステーブルへの列 、これには常にそのような列が含まれているようです(そして、それを防ぐ手段を提供していないようです)。