ทบทวนแนวทางแก้ไขที่เป็นไปได้อื่น ๆ
รวมเฉพาะ INSERT
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 ส่วนแทรกที่พิจารณาว่าเป็นบรรทัดใหม่ในค่าคอลัมน์ที่มีนิพจน์เช่นนี้
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