2013-11-25 4 views
8

मैं RPostgreSQL का उपयोग कर पूर्व-मौजूदा PostgreSQL तालिका में डेटा डालने का प्रयास कर रहा हूं और मैं SQL पैरामीटर (तैयार कथन) के लिए वाक्यविन्यास नहीं समझ सकता।RPostgreSQL (डेटा डालने के लिए) के साथ पैरामीटर का उपयोग कैसे करें

उदा। लगता है मैं निम्नलिखित

insert into mytable (a,b,c) values ($1,$2,$3)

मैं कैसे पैरामीटर निर्दिष्ट करते करना चाहते हैं? dbSendQuery समझ में नहीं आता है अगर आप केवल ... में पैरामीटर डालते हैं।

मुझे मिला है dbWriteTable का उपयोग पूरे टेबल को डंप करने के लिए किया जा सकता है, लेकिन आपको कॉलम निर्दिष्ट नहीं करने देगा (इसलिए डिफ़ॉल्ट आदि के लिए कोई अच्छा नहीं)। और वैसे भी, मुझे वहां डेटा प्राप्त करने के बाद अन्य प्रश्नों के लिए यह जानना होगा (इसलिए मुझे लगता है कि यह वास्तव में विशिष्ट नहीं है)!

ज़रूर मैं बस कुछ स्पष्ट याद कर रहा हूँ ...

+1

[क्या इसका जवाब मदद] [1]? यह प्रश्न वहां पूछे गए जैसा ही प्रतीत होता है। [1]: http://stackoverflow.com/questions/2186015/bind-variables-in-r-dbi –

+1

@JoeLove मुझे लगता है कि (लेकिन 100% यकीन नहीं है) कि कि RSQLite के लिए विशिष्ट है । – joran

+0

@ जोरान, हाँ, यह गलत हो गया (इसे हटा दिया गया)। मैं इसका मतलब विपरीत था: आर एक आंकड़े भाषा है, यह परेशान होना गलत होगा कि डीबी कार्यक्षमता एक सामान्य उद्देश्य भाषा की तुलना में कमजोर है। जैसे आप सी # में glm की उम्मीद नहीं करेंगे। जैसा कि: यह आर की गलती नहीं है मैं नौकरी के लिए गलत उपकरण का उपयोग कर रहा हूं। – Corone

उत्तर

6

मैं एक ही बात के लिए देख रहा था, एक ही कारण है, जो सुरक्षा के लिए है।

स्पष्ट रूप से dplyr पैकेज में आपकी क्षमता है जिसकी आप रुचि रखते हैं। यह शायद ही कभी दस्तावेज है, लेकिन यह वहां है। इस विग्नेट में "पोस्टग्रेस्क्ल" तक नीचे स्क्रॉल करें: http://cran.r-project.org/web/packages/dplyr/vignettes/databases.html

सारांशित करने के लिए, dplyr कार्यों को sql() और escape() प्रदान करता है, जिसे पैरामीट्रिज्ड क्वेरी बनाने के लिए जोड़ा जा सकता है। डीबीआई पैकेज से एसक्यूएल() फ़ंक्शन बिल्कुल उसी तरह काम करता प्रतीत होता है।

> sql(paste0('SELECT * FROM blaah WHERE id = ', escape('random "\'stuff'))) 
<SQL> SELECT * FROM blaah WHERE id = 'random "''stuff' 

यह वर्ग "एसक्यूएल" और "चरित्र" का एक उद्देश्य देता है, तो आप या तो इसे tbl को भेज देगा() या संभवतः dbSendQuery() के रूप में अच्छी तरह से कर सकते हैं।

बच() फ़ंक्शन सही ढंग से और साथ ही वैक्टर संभालती है, जो मैं सबसे उपयोगी लगते हैं:

> sql(paste0('SELECT * FROM blaah WHERE id in ', escape(1:5))) 
<SQL> SELECT * FROM blaah WHERE id in (1, 2, 3, 4, 5) 

ही स्वाभाविक रूप से चर के साथ काम करता है:

> tmp <- c("asd", 2, date()) 
> sql(paste0('SELECT * FROM blaah WHERE id in ', escape(tmp))) 
<SQL> SELECT * FROM blaah WHERE id in ('asd', '2', 'Tue Nov 18 15:19:08 2014') 

मैं अब ज्यादा सुरक्षित महसूस एक साथ डाल प्रश्नों।

+2

आप नए https://github.com/rstats-db/RPostgres का भी उपयोग कर सकते हैं जिसमें पैरामीटरयुक्त प्रश्नों के लिए पूर्ण समर्थन है – hadley

+0

धन्यवाद @ हैडली। Parametrized भाग पर कोई उदाहरण मिला?मैंने कुछ दिनों पहले एक [ब्लॉग पोस्ट] लिखा था (http://welcome-to-data-science.blogspot.com/2015/02/how-to-manage-large-amount-of-data-with.html) बड़े आवेषण के प्रदर्शन पर और मैं संकुल के बीच तुलना करना चाहता हूं। – LauriK

+1

अभी तक नहीं, लेकिन मैं अगले सप्ताह Rstudio ब्लॉग के लिए ब्लॉग पोस्ट पर काम कर रहा हूं। ध्यान दें कि पोस्टग्रेज़ के लिए पैरामीटरयुक्त आवेषण धीमे हैं, इसलिए RPostgres में dbWriteTable एक अलग रणनीति (लोड INFILE) – hadley

1

नवीनतम RPostgreSQL के रूप में यह काम करना चाहिए:

db_connection <- dbConnect(dbDriver("PostgreSQL"), dbname = database_name, 
        host = "localhost", port = database_port, password=database_user_password, 
        user = database_user) 
qry = "insert into mytable (a,b,c) values ($1,$2,$3)" 
dbSendQuery(db_connection, qry, c(1, "some string", "some string with | ' ")) 
+0

मुझे कम से कम 'dbGetQuery' के साथ काम करने के लिए एक समान चीज़ नहीं मिल सकती है। क्या आप एक और विस्तृत स्रोत प्रदान कर सकते हैं? – Pranasas

संबंधित मुद्दे