2008-09-16 13 views
158

डेटाबेस के कुछ SQLite3 टेबल (सभी टेबल नहीं) के डेटा, और केवल डेटा, स्कीमा को कैसे डंप करें? डंप एसक्यूएल प्रारूप में होना चाहिए, क्योंकि इसे बाद में डेटाबेस में आसानी से फिर से दर्ज किया जाना चाहिए और कमांड लाइन से किया जाना चाहिए। कुछमैं कुछ SQLite3 टेबल के डेटा को डंप कैसे करूं?

sqlite3 db .dump 

लेकिन स्कीमा को डंप किए बिना और कौन सी टेबल डंप करने के लिए चुनते हैं।

+0

किस प्रारूप में?विशेष रूप से कुछ भी, या आप सिर्फ मानव पठनीय बैकअप की तलाश में हैं? कृपया निर्दिष्ट करें। – dmckee

+1

मैं SQL प्रारूप में डंप करना चाहता हूं, ताकि मैं इसे आसानी से पुनर्स्थापित कर सकूं। मैंने उस जानकारी को मुख्य प्रश्न में जोड़ा है। – Pablo

उत्तर

-3

आप सीएसवी बनाने के लिए प्रत्येक फ़ील्ड के बाद कॉमा डालने वाली टेबलों पर चयन कर सकते हैं, या सभी डेटा वापस करने और इसे एक सीएसवी में सहेजने के लिए एक जीयूआई उपकरण का उपयोग कर सकते हैं।

+2

मेरा इरादा एक एसक्यूएल फाइल तैयार करना था जो आसानी से डीबी में फिर से जोड़ा जा सकता था। – Pablo

2

स्कीमा भागों को छोड़कर, SQLite3 डीबी डंप कोड को ले जाने का सबसे अच्छा तरीका होगा।

उदाहरण छद्म कोड:

SELECT 'INSERT INTO ' || tableName || ' VALUES(' || 
    {for each value} ' quote(' || value || ')'  (+ commas until final) 
|| ')' FROM 'tableName' ORDER BY rowid DESC 

देखें: src/shell.c:838 (SQLite-3.5.9 के लिए) वास्तविक कोड

के लिए तुम भी सिर्फ इतना है कि खोल लेते हैं और बाहर टिप्पणी स्कीमा भागों और है कि प्रयोग कर सकते हैं।

189

आप यह नहीं कहते कि आप डंप किए गए फ़ाइल के साथ क्या करना चाहते हैं।

मैं एक CSV फ़ाइल है, जो मैं लगभग सब कुछ में आयात कर सकते प्राप्त करने के लिए निम्नलिखित का प्रयोग करेंगे

.mode csv 
-- use '.separator SOME_STRING' for something other than a comma. 
.headers on 
.out file.dmp 
select * from MyTable; 

आप तो एक अलग SQLite डेटाबेस में डालें करना चाहते हैं:

.mode insert <target_table_name> 
.out file.sql 
select * from MyTable; 
+0

एसक्यूएल स्टेटमेंट का उपयोग करके प्रोग्रामेटिक रूप से ऐसा करने का कोई तरीका है? मैं देख सकता हूं कि दुभाषिया का उपयोग करके इसे कैसे किया जाए, लेकिन अगर मैं एक स्क्रिप्ट लिखना चाहता हूं तो क्या होगा? – coleifer

+3

आप अपने विवरणों को एक फ़ाइल में डाल सकते हैं (उदाहरण के लिए sample.txt) और फिर इसका उपयोग करके: sqlite3 db.sq3 CyberFonic

35
नहीं

सबसे अच्छा तरीका है, लेकिन पट्टा बाहरी उपकरण की जरूरत नहीं है (ग्रेप, जो वैसे भी * nix बक्से पर मानक है को छोड़कर) पर

sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"' 

लेकिन आपको जिस तालिका को आप खोज रहे हैं, उसके लिए आपको यह आदेश करने की आवश्यकता है।

ध्यान दें कि इसमें स्कीमा शामिल नहीं है।

+1

मैंने 'sqlite3 डेटाबेस.s3db .dump' –

+3

का उपयोग किया है यदि यह प्रविष्टियों में न्यूलाइन है मूल्य। 'Grep -v '^ CREATE'' का उपयोग अन्य प्रतिक्रियाओं में से एक में सुझाया गया है जैसा कि' grep -v '^ CREATE का उपयोग करते हुए – dequis

+1

में से एक में सुझाव दिया गया है;' CREATE 'कथन में लाइन ब्रेक होने पर तोड़ दिया जाएगा (जिसे वे कभी-कभी करते हैं)। बेस्ट, आईएमओ, 'CREATE' कथन को स्वचालित रूप से बाहर नहीं निकालना है, लेकिन मैन्युअल रूप से उन्हें संपादित करें। बस आपको जो भी टेक्स्ट एडिटर चाहिए, उसका उपयोग करें, और 'CREATE' के लिए खोजें और मैन्युअल रूप से उन कथन को हटा दें। जब तक डेटाबेस बड़ा नहीं है (और चूंकि आप स्क्लाइट का उपयोग कर रहे हैं, मुझे लगता है कि यह नोट है), तो यह बहुत आसान है। –

31

आप .dump विशेष कमांड के लिए एक या अधिक तालिका तर्क निर्दिष्ट कर सकते हैं, उदा। sqlite3 db ".dump 'table1' 'table2'"

+0

जब मैंने आपके द्वारा वर्णित कई तालिका नाम जोड़ते हैं, तो यह मुझे यह आउटपुट देता है: उपयोग: .dump? - संरक्षित-पंक्तियां? ? तरह-पैटर्न? – mwm

123

आप इसे .chechema और .dump कमांड का अंतर प्राप्त कर सकते हैं। ग्रेप साथ उदाहरण के लिए:

BEGIN TRANSACTION; 
INSERT INTO "table1" VALUES ...; 
... 
INSERT INTO "table2" VALUES ...; 
... 
COMMIT; 

मुझे आशा है कि इस मदद करता है:

sqlite3 some.db .schema > schema.sql 
sqlite3 some.db .dump > dump.sql 
grep -vx -f schema.sql dump.sql > data.sql 

data.sql फ़ाइल कुछ इस तरह स्कीमा के बिना केवल डेटा होगा,।

+0

किसी भी प्रत्यक्ष आदेश उन्हें वापस आयात करने के लिए? – dorado

+3

@anurageldorado यह सादा वर्ग है। बस 'sqlite3 some.db चलाएं jellyfish

+0

कुछ रासन मेरे लिए काम नहीं करते हैं। मुझे आसपास के उपयोग की ज़रूरत है। 'sqlite3 स्टोरेज/डीबी/jobs.s3db .chechema नौकरियां> schema.sql' काम नहीं करती है, लेकिन 'echo' .chechema नौकरियां | sqlite3 स्टोरेज/डीबी/jobs.s3db> schema.sql' ठीक काम – abkrim

8

पॉल एगान के जवाब देने के लिए एक सुधार के रूप में, यह इस प्रकार पूरा किया जा सकता:

sqlite3 database.db3 '.dump "table1" "table2"' | grep '^INSERT' 

--or--

sqlite3 database.db3 '.dump "table1" "table2"' | grep -v '^CREATE' 

चेतावनी, ज़ाहिर है, आप के लिए है कि है grep स्थापित।

+1

मुझे यह पसंद है। एक अतिरिक्त बोनस के रूप में, यह अभी भी काम करता है यदि आपके पास एक डंपेड SQL फ़ाइल है जो आसपास लटकती है, बस 'cat डेटाबेस.sql | grep '^ INSERT'> डेटाबेस_inserts.sql' (स्कीमा के लिए, 'grep '^ CREATE'' – trisweb

+2

@trisweb के साथ प्रतिस्थापित करें, बेशक आप' grep '^ INSERT' <डेटाबेस.sql> डेटाबेस_inserts.sql' का अर्थ है कि बिल्ली 'अनावश्यक – Sebastian

+1

इसके बारे में कुछ भी अनिवार्य नहीं है। 'बिल्ली' लागत को मूल रूप से निष्पादित करने के लिए कुछ भी नहीं है और उत्पादन की श्रृंखला को अधिक स्पष्ट करने के लिए बनाता है। बेशक, आप' rjh

2

इस संस्करण आवेषण के अंदर नई-पंक्तियों के साथ अच्छी तरह से काम करता है:

sqlite3 database.sqlite3 .dump | grep -v '^CREATE'

अभ्यास में सभी लाइनों CREATE जो कम नई-पंक्तियों

9

कोई जवाब जो ग्रेप का उपयोग कर पता चलता है बाहर करने के लिए शामिल होने की संभावना है के साथ शुरू शामिल नहीं CREATE लाइनें या आउटपुट से INSERT लाइनों को बस पकड़ें। CREATE TABLE कमांड प्रति पंक्ति एक कॉलम सूचीबद्ध करते हैं (इसलिए CREATE को छोड़कर यह सब नहीं मिलेगा), और INSERT लाइनों पर मानों को एम्बेडेड न्यूलाइन हो सकती है (इसलिए आप केवल INSERT लाइनों को नहीं पकड़ सकते हैं)।

for t in $(sqlite3 $DB .tables); do 
    echo -e ".mode insert $t\nselect * from $t;" 
done | sqlite3 $DB > backup.sql 

sqlite3 संस्करण 3.6.20 पर परीक्षण किया गया।

यदि आप कुछ टेबल को बाहर करना चाहते हैं तो आप उन्हें $(sqlite $DB .tables | grep -v -e one -e two -e three) से फ़िल्टर कर सकते हैं, या यदि आप के साथ एक विशिष्ट सबसेट को प्रतिस्थापित करना चाहते हैं।

6

पायथन या जावा या किसी भी उच्च स्तर की भाषा में। डंप काम नहीं करता है। हमें हाथ से सीएसवी में रूपांतरण कोड करने की जरूरत है। मैं एक पायथन उदाहरण देता हूं। अन्य, उदाहरण की सराहना की जाएगी:

from os import path 
import csv 

def convert_to_csv(directory, db_name): 
    conn = sqlite3.connect(path.join(directory, db_name + '.db')) 
    cursor = conn.cursor() 
    cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") 
    tables = cursor.fetchall() 
    for table in tables: 
     table = table[0] 
     cursor.execute('SELECT * FROM ' + table) 
     column_names = [column_name[0] for column_name in cursor.description] 
     with open(path.join(directory, table + '.csv'), 'w') as csv_file: 
      csv_writer = csv.writer(csv_file) 
      csv_writer.writerow(column_names) 
      while True: 
       try: 
        csv_writer.writerow(cursor.fetchone()) 
       except csv.Error: 
        break 

आप दूसरे शब्दों में पैनल डेटा, है, तो 'आईडी के साथ कई व्यक्तिगत प्रविष्टियों देखो के साथ करने के लिए इस जोड़ सकते हैं और यह भी सारांश आँकड़े उदासीनता:

 if 'id' in column_names: 
      with open(path.join(directory, table + '_aggregate.csv'), 'w') as csv_file: 
       csv_writer = csv.writer(csv_file) 
       column_names.remove('id') 
       column_names.remove('round') 
       sum_string = ','.join('sum(%s)' % item for item in column_names) 
       cursor.execute('SELECT round, ' + sum_string +' FROM ' + table + ' GROUP BY round;') 
       csv_writer.writerow(['round'] + column_names) 
       while True: 
        try: 
         csv_writer.writerow(cursor.fetchone()) 
        except csv.Error: 
         break 
0

retracile द्वारा जवाब निकटतम होना चाहिए, फिर भी यह मेरे मामले के लिए काम नहीं करता है। एक सम्मिलित क्वेरी सिर्फ बीच में टूट गई और निर्यात अभी बंद हो गया। निश्चित नहीं है कि कारण क्या है। हालांकि यह .dump के दौरान ठीक काम करता है।

अंत में मैं एसक्यूएल .dump से उत्पन्न विभाजित के लिए एक उपकरण लिखा है:

https://github.com/motherapp/sqlite_sql_parser/

1

अन्य संभावित समाधानों की समीक्षा

शामिल केवल आवेषण

sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"' 

आसान लागू करने के लिए, लेकिन यदि आपके किसी भी कॉलम सहित यह विफल हो जाएगा Ude नई लाइनों

SQLite डालने मोड

for t in $(sqlite3 $DB .tables); do 
    echo -e ".mode insert $t\nselect * from $t;" 
done | sqlite3 $DB > backup.sql 

यह एक अच्छा और अनुकूलन समाधान है, लेकिन अगर आपके कॉलम की तरह spatialite

में 'ज्यामिति' प्रकार ब्लॉब ऑब्जेक्ट यह काम नहीं करता Diff स्कीमा

sqlite3 some.db .schema > schema.sql 
sqlite3 some.db .dump > dump.sql 
grep -v -f schema.sql dump > data.sql 

सुनिश्चित नहीं हैं कि क साथ डंप y, लेकिन मेरे लिए काम नहीं कर रहा

एक और (नया) संभव समाधान

शायद वहाँ इस सवाल का एक सर्वश्रेष्ठ उत्तर नहीं है, लेकिन एक है कि मेरे लिए काम कर रहा है आवेषण grep है खाता है कि नए हो को ध्यान में रखकर एक expression like this

grep -Pzo "(?s)^INSERT.*\);[ \t]*$" 

साथ स्तंभ मानों में लाइनों टेबल चयन करने के लिए फेंक दिया जा है .dump एक तरह तर्क तालिका नाम से मेल करने मानते हैं, लेकिन अगर यह पर्याप्त नहीं है शायद एक सरल स्क्रिप्ट बेहतर विकल्प

है
TABLES='table1 table2 table3' 

echo '' > /tmp/backup.sql 
for t in $TABLES ; do 
    echo -e ".dump ${t}" | sqlite3 database.db3 | grep -Pzo "(?s)^INSERT.*?\);$" >> /tmp/backup.sql 
done 

या, कुछ और अधिक विदेशी कुंजी का सम्मान करते हैं और केवल एक ही लेन-देन

TABLES='table1 table2 table3' 

echo 'BEGIN TRANSACTION;' > /tmp/backup.sql 
echo '' >> /tmp/backup.sql 
for t in $TABLES ; do 
    echo -e ".dump ${t}" | sqlite3 $1 | grep -Pzo "(?s)^INSERT.*?\);$" | grep -v -e 'PRAGMA foreign_keys=OFF;' -e 'BEGIN TRANSACTION;' -e 'COMMIT;' >> /tmp/backup.sql 
done 

echo '' >> /tmp/backup.sql 
echo 'COMMIT;' >> /tmp/backup.sql 

में सभी डंप संपुटित को ध्यान में रखें कि अगर ); एक स्ट्रिंग कॉलम

में से किसी में मौजूद है ग्रेप अभिव्यक्ति असफल हो जायेगी को सविस्तार

sqlite3 -bail database.db3 < /tmp/backup.sql 
4

(पहले से बनाए टेबल के साथ एक डेटाबेस में) पुनर्स्थापित करने के लिए SQLite प्रलेखन के अनुसार Command Line Shell For SQLite के लिए आप सीएसवी के रूप में, बस "मोड" के लिए "csv" की स्थापना करके एक SQLite तालिका (या एक मेज का हिस्सा) निर्यात कर सकते हैं और फिर मेज के वांछित पंक्तियों को निकालने के लिए कोई क्वेरी चलाने:

sqlite> .header on 
sqlite> .mode csv 
sqlite> .once c:/work/dataout.csv 
sqlite> SELECT * FROM tab1; 
sqlite> .exit 

फिर CSV (कॉमा सेपरेटेड वैल्यू) एक SQLite तालिका में डेटा आयात करने के लिए ".import" आदेश का उपयोग करें:

sqlite> .mode csv 
sqlite> .import C:/work/dataout.csv tab1 
sqlite> .exit 

कृपया दो मामलों के बारे में अधिक दस्तावेज़ पढ़ें विचार करने के लिए: (1) तालिका "tab1" करता है पहले मौजूद नहीं है और (2) तालिका "टैब 1" पहले से मौजूद है।

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