PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

आर से पोस्टग्रेएसक्यूएल में एक टेबल कैसे लिखें?

ठीक है, मैं नहीं जानता कि क्यों 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() . के विपरीत , जिसमें हमेशा ऐसा कॉलम शामिल होता है (और इसे रोकने का कोई साधन प्रदान नहीं करता है)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. बड़ी संख्या में रिकॉर्ड चलाने के लिए हमेशा के लिए कार्य करना

  2. PostgreSQL DATEADD () समतुल्य

  3. त्रुटि:JDBC के माध्यम से DDL को SELECT के साथ मिलाते समय कैश्ड प्लान को परिणाम प्रकार नहीं बदलना चाहिए

  4. सही ढंग से अनुक्रम के साथ ENUM ड्रॉप करें और बनाएं?

  5. स्प्रिंग रू के लिए 'org.postgresql.Driver' के लिए JDBC ड्राइवर उपलब्ध नहीं है