ठीक है, मैं नहीं जानता कि क्यों dbWriteTable()
असफल हो रहा होगा; किसी प्रकार का संस्करण/प्रोटोकॉल बेमेल हो सकता है। शायद आप R के नवीनतम संस्करण, RPostgreSQL पैकेज को स्थापित करने और यदि संभव हो तो अपने सिस्टम पर PostgreSQL सर्वर को अपग्रेड करने का प्रयास कर सकते हैं।
insert into
. के संबंध में बड़े डेटा के लिए वर्कअराउंड विफल होना, आईटी दुनिया में अक्सर क्या किया जाता है जब बड़ी मात्रा में डेटा को स्थानांतरित किया जाना चाहिए और एक-शॉट स्थानांतरण अक्षम/अव्यावहारिक/फ्लैकी है जिसे कभी-कभी बैचिंग के रूप में जाना जाता है। या बैच प्रोसेसिंग
. मूल रूप से, आप डेटा को छोटे-छोटे हिस्सों में बांटते हैं और एक-एक करके एक-एक चंक भेजते हैं।
एक यादृच्छिक उदाहरण के रूप में, कुछ साल पहले मैंने एचआर एलडीएपी सर्वर से कर्मचारी जानकारी के लिए कुछ जावा कोड लिखा था जो एक समय में केवल 1000 रिकॉर्ड प्रदान करने के लिए बाध्य था। तो मूल रूप से मुझे एक ही अनुरोध भेजने के लिए एक लूप लिखना पड़ा (क्वेरी स्थिति के साथ किसी प्रकार का अजीब कुकी-आधारित तंत्र ) और रिकॉर्ड्स को स्थानीय डेटाबेस में तब तक जमा करना जब तक कि सर्वर ने क्वेरी को पूरा नहीं कर दिया।
यहां कुछ कोड दिया गया है जो किसी दिए गए डेटा.फ्रेम के आधार पर एक खाली तालिका बनाने के लिए मैन्युअल रूप से SQL का निर्माण करता है, और फिर पैरामीटरयुक्त बैच आकार का उपयोग करके डेटा.फ्रेम की सामग्री को तालिका में सम्मिलित करता है। यह ज्यादातर 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()
. के विपरीत , जिसमें हमेशा ऐसा कॉलम शामिल होता है (और इसे रोकने का कोई साधन प्रदान नहीं करता है)।