2014-10-25 2 views
18

मैं dplyr पैकेज की डेटाबेस कनेक्शन क्षमताओं के लिए नया हूं, लेकिन मुझे SQLite कनेक्शन के लिए इसका उपयोग करने में बहुत दिलचस्पी है। मैं this tutorial पीछा किया और एक SQLite डेटाबेस (my_db)क्या dplyr पैकेज का उपयोग कर SQLite डीबी तालिका में एक पंक्ति डालना संभव है?

my_db <- src_sqlite("my_db.sqlite3", create = T) 

बनाया है और इस डेटाबेस की एक तालिका (My_table) के रूप में एक dataframe (DF) डाला।

copy_to(my_db,df,"my_table") 

अब मैं इस तालिका में नई पंक्तियाँ सम्मिलित करना चाहते हैं। मैं कुछ इस तरह की कोशिश की है (और यह हाँ मैं मानता चाहिए भी होनहार तरह नहीं दिखता है ... लेकिन मैं अभी भी यह एक कोशिश दे दी है):

collect(build_sql("INSERT INTO my_table VALUES (",newdf,")", con=my_db)) 

अगर एक मौजूदा SQLite db तालिका में पंक्तियां जोड़ने किसी को भी पता है dplyr का उपयोग कर भी संभव है? या आप इस समस्या से कैसे निपटेंगे? अग्रिम में बहुत धन्यवाद!

+1

पैकेज 'sqldf' चेक के लायक है। यह डेटाफ्रेम और एसक्यूएल टेबल के साथ आसान बातचीत की अनुमति देता है। –

+0

https://stackoverflow.com/questions/26568182/is-it-possible-to-insert-add-a-row-to-a-sqlite-db-table-using-dplyr-package/26784801#comment80776297_26784801 और देखें https://github.com/tidyverse/dplyr/issues/3120#issuecomment-339034612 - यह कुछ हद तक संभव है, लेकिन अजीब है, और इसके खिलाफ अनुशंसित है। इसके बजाय डीबीआई :: का प्रयोग करें। –

उत्तर

9

आप एक डेटाबेस/dplyr के माध्यम से बनाया मेज पर एसक्यूएल कार्रवाई कर सकते हैं, लेकिन आप RSQLite/DBI कॉल पर वापस लौटने और परिवर्तन आप कैसे डेटाबेस/तालिका बना करने के लिए है:

library(dplyr) 

my_db <- src_sqlite("my_db.sqlite3", create=TRUE) 
copy_to(my_db, iris, "my_table", temporary=FALSE) # need to set temporary to FALSE 

# grab the db connection from the object created by src_sqlite 
# and issue the INSERT That way 

res <- dbSendQuery(my_db$con, 
        'INSERT INTO my_table VALUES (9.9, 9.9, 9.9, 9.9, "new")') 
+0

धन्यवाद! यह काम करता हैं। क्या आपको लगता है कि केवल एक पंक्ति के बजाय, संपूर्ण टेबल को मौजूदा टेबल में जोड़ना संभव है? या वह पूरी तरह से एक एसक्यूएल सवाल है? – rdatasculptor

+0

ठीक है, मुझे लगता है कि मैं dbSendQuery के बजाय dbWriteTable फ़ंक्शन का उपयोग कर सकता हूं। हालांकि मैं यह संदेश प्राप्त करता रहता हूं: "sqliteWriteTable (conn, name, value, ...) में: लेनदेन शुरू करने में असमर्थ"। – rdatasculptor

+0

मैं अपनी टिप्पणियों के साथ बहुत जल्दी था। हाल ही में एक RSQLite अद्यतन था जिसे मैंने अभी तक स्थापित नहीं किया था। सब कुछ अब योजनाबद्ध के रूप में काम करता है। धन्यवाद फिर से hrbrmstr! – rdatasculptor

47

नहीं, आप यह सब dplyr के भीतर कर सकते हैं।

require(dplyr) 

my_db <- src_sqlite("my_db.sqlite3", create = TRUE)     # create src 
copy_to(my_db, iris, "my_table", temporary = FALSE)     # create table 
newdf = iris               # create new data 
db_insert_into(con = my_db$con, table = "my_table", values = newdf) # insert into 
+0

का उपयोग करना बेहतर होगा, मुझे लगता है कि यह db_insert_into (con = my_db $ con, table =" my_table ", ** value ** = newdf) – dalloliogm

+0

reiserting आईरिस मेरे लिए काम किया: 'db_insert_into (con = my_db $ con, table =" my_table ", value = iris)' –

+0

सहायता दस्तावेज़ों के अनुसार, 'db_write_table (..., append = TRUE) 'बहिष्कृत को प्रतिस्थापित करने का इरादा है 'db_insert_into() 'फ़ंक्शन, लेकिन 2017-09-22 तक, यह sqlite3 के साथ काम नहीं करता है। –

8

this newsgroup में। हैडली ने dplyr::copy_to() फ़ंक्शन के उद्देश्य को समझाया। यह अस्थायी परीक्षण टेबल बनाने का इरादा है। ईमेल एक्सचेंज मौजूदा तालिका में डेटा जोड़ने के लिए RMySQL::dbWriteTable() का उपयोग करने का सुझाव देकर समाप्त होता है। उपरोक्त स्वीकृत उत्तर में समझाया गया है, जैसा कि SQLite डेटाबेस पर लागू होता है।

एक डेटा फ्रेम dtf जो एक मौजूदा डेटाबेस तालिका के रूप में ही स्तंभ नाम है संलग्न करने के लिए, मैं प्रयोग किया है:

library(RMySQL) 
DB <- dbConnect(MySQL(), user="usename", host="localhost", 
        password="***", dbname="dbname") 
dbWriteTable(DB, "tablename", dtf, append=TRUE, row.names = FALSE) 
+1

क्षमा करें मुझे एहसास है कि आपका प्रश्न SQLite तालिका में पंक्तियों को जोड़ने के बारे में था। मैं अपनी खोज के दौरान यहां उतरा। शायद मैं इस पल के लिए अपना जवाब छोड़ दो। –

+0

किसी भी तरह धन्यवाद! यह दिलचस्प अतिरिक्त जानकारी है। – rdatasculptor

1

मुख्य कारण मैं dplyr का प्रयोग कर एक डेटाबेस में लिखने के लिए है कि मैं नहीं करना चाहते भाषा मध्य कोड के बीच स्विच करें। आपके प्रश्न के लिए सबसे अच्छा समाधान मुझे लगता है कि db_insert_into()dplyr का कार्य StatSandwich

+0

आपको एसक्यूएल पर स्विच करने की आवश्यकता नहीं है, लेकिन आप आर में 'डीबीआई :: डीबीड्राइटटेबल() 'आदि का उपयोग कर सकते हैं। –

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