অন্যান্য সম্ভাব্য সমাধানগুলির পর্যালোচনা
কেবল INSERTs অন্তর্ভুক্ত করুন
sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'
কার্যকর করা সহজ তবে যদি আপনার কোনও কলামে নতুন লাইন অন্তর্ভুক্ত থাকে তবে তা ব্যর্থ হবে
এসকিউএলাইট সন্নিবেশ মোড
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
অ্যাকাউন্টে বিবেচনা করুন যে );
কোনও কলামে একটি স্ট্রিং উপস্থিত থাকলে গ্রেপ এক্সপ্রেশন ব্যর্থ হবে
এটি পুনরুদ্ধার করতে (ইতিমধ্যে তৈরি টেবিলগুলির সাথে একটি ডাটাবেসে)
sqlite3 -bail database.db3 < /tmp/backup.sql