दिलचस्प पोस्ट
लोकलहोस्ट के बजाए आईपी पता के साथ वेब साइट को ब्राउज़ करें ब्राउज़र पृष्ठ में चयनित पाठ के समन्वय IE8 और फ़ायरफ़ॉक्स में एलेमेंट? सी "त्रुटि: स्थानीय चर का फ़ंक्शन रिटर्न पता" सीमा के आकार <टी> में .NET? file_get_contents () मुझे 403 निषिद्ध करें प्रतिस्थापन का उपयोग करते समय जावास्क्रिप्ट केवल पहला उदाहरण क्यों बदलता है? jQuery स्क्रोलपॉप क्रोम में काम नहीं कर रहा है लेकिन फ़ायरफ़ॉक्स में काम कर रहा है बेस 64 छवियाँ एम्बेड करना multiprocessing.Pool: map_async और imap के बीच अंतर क्या है? <My code> में त्रुटि: असाइनमेंट का लक्ष्य गैर-भाषा ऑब्जेक्ट का विस्तार करता है क्या पायथन के साथ sys.path सेट करता है, और कब? छद्म-तत्व सामग्री के बाद :: या :: के लिए लाइन ब्रेक जोड़ें जावा regex \ s के साथ काम नहीं करता, कहते हैं: अमान्य से बच अनुक्रम सी ++ गेटर्स / सेटिंग कोडिंग शैली

मैं कुछ SQLite3 तालिकाओं के डेटा को कैसे डंप कर सकता हूं?

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

sqlite3 db .dump 

लेकिन स्कीमा डंपिंग के बिना और डंप के लिए कौन सी तालिकाओं को चुनना

Solutions Collecting From Web of "मैं कुछ SQLite3 तालिकाओं के डेटा को कैसे डंप कर सकता हूं?"

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

मैं एक सीएसवी फ़ाइल प्राप्त करने के लिए निम्नलिखित का उपयोग करता हूं, जिसे मैं लगभग सभी चीजों में आयात कर सकता हूं

 .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; 

आप .checkma और .dump आदेशों का अंतर प्राप्त कर सकते हैं। उदाहरण के लिए grep के साथ:

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

data.sql फ़ाइल में स्कीमा के बिना केवल डेटा शामिल होगा, ऐसा कुछ:

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

मैं आशान्वित हूं कि इससे आपको सहायता मिलेगी।

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

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

लेकिन आपको इस तालिका को प्रत्येक तालिका के लिए करना है जिसे आप ढूंढ रहे हैं।

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

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

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

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

–or–

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

चेतावनी, ज़ाहिर है, आपको grep इंस्टॉल करना होगा।

CREATE लाइनों को बाहर करने के लिए grep का उपयोग करने के लिए कोई सुझाव या केवल sqlite3 $DB .dump से INSERT लाइनें ले sqlite3 $DB .dump आउटपुट बुरी तरह विफल हो जाएगा। 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) साथ फ़िल्टर कर सकते हैं, या यदि आप एक विशिष्ट $(sqlite $DB .tables | grep -v -e one -e two -e three) प्राप्त करना चाहते हैं तो इसे one two three साथ बदलें

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

 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 

SQLite प्रलेखन के अनुसार कमांड लाइन शेल के लिए SQLite के लिए आप "मोड" को "csv" पर सेट करके और फिर एक क्वेरी चलाने के लिए इच्छित पंक्तियों को निकालने के लिए, एक SQLite तालिका (या किसी तालिका का भाग) को CSV के रूप में निर्यात कर सकते हैं टेबल:

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

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

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

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

आप SQLite प्रशासक जैसे उपकरण का उपयोग कर सकते हैं

यहां ऐसे टूल की एक लंबी सूची है

स्कीमा भागों को छोड़कर, सबसे अच्छा तरीका यह होगा कि कोड को sqlite3 db डंप करना होगा।

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

 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 के लिए)

आप यहां तक ​​कि उस खोल को ले जा सकते हैं और स्कीमा भागों को टिप्पणी कर सकते हैं और उस का उपयोग कर सकते हैं

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

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

प्रथा में उन सभी लाइनों को शामिल नहीं किया जाता है जो CREATE शुरु होते हैं जो न्यूलाइन को कम करने की संभावना है

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

केवल INSERTs शामिल करें

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

कार्यान्वित करने में आसान है लेकिन यदि आपके कॉलम में कोई भी नई लाइनें शामिल हों तो यह विफल हो जायेगी

SQLite डालने मोड

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

यह एक अच्छा और अनुकूलन योग्य समाधान है, लेकिन यह काम नहीं करता यदि आपके कॉलम में ब्लॉब ऑब्जेक्ट्स जैसे 'ज्यामिति' प्रकार स्पेसिअलइट में हों

स्कीमा के साथ डंप को अलग करना

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

सुनिश्चित नहीं है कि क्यों, लेकिन मेरे लिए काम नहीं कर रहा है

एक अन्य (नया) संभव समाधान

शायद इस प्रश्न का सबसे अच्छा उत्तर नहीं है, लेकिन जो मेरे लिए काम कर रहा है वह उस सम्मिलन को ध्यान में रखता है जो कॉलम मूल्यों में नई लाइनें होती है जैसे कि इस तरह की अभिव्यक्ति

 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 

ध्यान दें कि grep अभिव्यक्ति विफल हो जाएगा यदि ); एक कॉलम में किसी स्ट्रिंग में मौजूद है

इसे पुनर्स्थापित करने के लिए (तालिकाओं के पहले से बनाए गए डेटाबेस के साथ)

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

रिट्र्रेस द्वारा जवाब सबसे निकटतम होना चाहिए, फिर भी यह मेरे मामले के लिए काम नहीं करता है। एक सम्मिलन क्वेरी सिर्फ मध्य में तोड़ दिया और निर्यात बस बंद कर दिया। यकीन नहीं है कि कारण क्या है हालांकि यह .dump दौरान ठीक काम करता है।

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

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

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