Diğer olası çözümlerin gözden geçirilmesi
Yalnızca INSERT'leri dahil et
sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'
Uygulaması kolaydır, ancak sütunlarınızdan herhangi birinde yeni satırlar varsa başarısız olur
SQLite ekleme modu
for t in $(sqlite3 $DB .tables); do
echo -e ".mode insert $t\nselect * from $t;"
done | sqlite3 $DB > backup.sql
Bu hoş ve özelleştirilebilir bir çözümdür, ancak sütunlarınızda mekansalda 'Geometri' türü gibi blob nesneleri varsa işe yaramaz.
Dökümü şema ile dağıtın
sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -v -f schema.sql dump > data.sql
Neden olduğundan emin değilim ama benim için çalışmıyor
Başka bir (yeni) olası çözüm
Muhtemelen bu soruya en iyi cevap yoktur, ancak benim için çalışan bir tanesi, böyle bir ifadeyle sütun değerlerinde yeni satırlar olduğunu dikkate alarak ekleri grep
grep -Pzo "(?s)^INSERT.*\);[ \t]*$"
Dumped tabloları seçmek için .dump
tablo adlarını eşleştirmek için bir LIKE argümanı kabul, ancak bu yeterli değilse, muhtemelen basit bir komut dosyası daha iyi bir seçenek
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
veya yabancı anahtarlara saygı göstermek ve tüm çöplüğü tek bir işlemde kapsüllemek için daha ayrıntılı bir şey
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
);
Sütunlardan herhangi birinde bir dize varsa grep ifadesinin başarısız olacağını dikkate alın
Geri yüklemek için (tablolar önceden oluşturulmuş bir veritabanında)
sqlite3 -bail database.db3 < /tmp/backup.sql