अन्य संभावित समाधानों की समीक्षा
केवल 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
तालिका नामों से मेल करने के लिए एक LIKE तर्क मानता है, लेकिन अगर यह पर्याप्त नहीं है तो एक सरल स्क्रिप्ट बेहतर विकल्प है
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