Tinjau solusi lain yang mungkin
Sertakan hanya INSERT
sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'
Mudah diimplementasikan tetapi akan gagal jika salah satu kolom Anda menyertakan baris baru
Mode penyisipan SQLite
for t in $(sqlite3 $DB .tables); do
echo -e ".mode insert $t\nselect * from $t;"
done | sqlite3 $DB > backup.sql
Ini adalah solusi yang bagus dan dapat disesuaikan, tetapi tidak berfungsi jika kolom Anda memiliki objek gumpalan seperti tipe 'Geometri' dalam spasial
Bedakan dengan skema
sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -v -f schema.sql dump > data.sql
Tidak yakin mengapa, tetapi tidak berhasil untuk saya
Solusi (baru) lainnya yang mungkin
Mungkin tidak ada jawaban terbaik untuk pertanyaan ini, tetapi salah satu yang berfungsi untuk saya adalah ambil sisipan dengan mempertimbangkan baris baru di kolom yang bernilai dengan ekspresi seperti ini
grep -Pzo "(?s)^INSERT.*\);[ \t]*$"
Untuk memilih tabel jangan dibuang .dumpmengakui argumen LIKE untuk mencocokkan nama tabel, tetapi jika ini tidak cukup mungkin skrip sederhana adalah pilihan yang lebih baik
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
atau, sesuatu yang lebih rumit untuk menghormati kunci asing dan merangkum semua dump hanya dalam satu transaksi
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
Mempertimbangkan bahwa ekspresi grep akan gagal jika );ada string di salah satu kolom
Untuk mengembalikannya (dalam database dengan tabel sudah dibuat)
sqlite3 -bail database.db3 < /tmp/backup.sql