Xem xét các giải pháp có thể khác
Chỉ bao gồm CHỨNG MINH
sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'
Dễ thực hiện nhưng sẽ thất bại nếu bất kỳ cột nào của bạn bao gồm các dòng mới
Chế độ chèn SQLite
for t in $(sqlite3 $DB .tables); do
echo -e ".mode insert $t\nselect * from $t;"
done | sqlite3 $DB > backup.sql
Đây là một giải pháp tốt và có thể tùy chỉnh, nhưng nó không hoạt động nếu các cột của bạn có các đối tượng blob như kiểu 'Hình học' trong không gian
Diff kết xuất với lược đồ
sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -v -f schema.sql dump > data.sql
Không chắc tại sao, nhưng không làm việc cho tôi
Một giải pháp khả thi (mới) khác
Có lẽ không có câu trả lời hay nhất cho câu hỏi này, nhưng câu trả lời phù hợp với tôi là grep các phần chèn có tính đến các dòng mới trong các giá trị cột với biểu thức như thế này
grep -Pzo "(?s)^INSERT.*\);[ \t]*$"
Để chọn các bảng, kết xuất sẽ .dump
thừa nhận một đối số THÍCH để khớp với các tên bảng, nhưng nếu điều này là không đủ có lẽ một kịch bản đơn giản là tùy chọn tốt hơn
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
hoặc, một cái gì đó được xây dựng để tôn trọng các khóa ngoại và đóng gói tất cả các kết xuất chỉ trong một giao dịch
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
Hãy xem xét rằng biểu thức grep sẽ thất bại nếu );
là một chuỗi có trong bất kỳ cột nào
Để khôi phục nó (trong cơ sở dữ liệu với các bảng đã được tạo)
sqlite3 -bail database.db3 < /tmp/backup.sql