Przegląd innych możliwych rozwiązań
Uwzględnij tylko WSTAWKI
sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'
Łatwy do wdrożenia, ale zawiedzie, jeśli którakolwiek z kolumn zawiera nowe wiersze
Tryb wstawiania SQLite
for t in $(sqlite3 $DB .tables); do
echo -e ".mode insert $t\nselect * from $t;"
done | sqlite3 $DB > backup.sql
To miłe i konfigurowalne rozwiązanie, ale nie działa, jeśli kolumny mają obiekty typu blob, takie jak „Geometry” w spatialite
Zróżnicuj zrzut ze schematem
sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -v -f schema.sql dump > data.sql
Nie jestem pewien, dlaczego, ale nie działa dla mnie
Kolejne (nowe) możliwe rozwiązanie
Prawdopodobnie nie ma najlepszej odpowiedzi na to pytanie, ale dla mnie działające jest grep wstawki, biorąc pod uwagę, że są to nowe wiersze w wartościach kolumny z takim wyrażeniem jak to
grep -Pzo "(?s)^INSERT.*\);[ \t]*$"
Aby wybrać tabele, które należy zrzucić, .dump
przyjmuje argument LIKE, aby dopasować nazwy tabel, ale jeśli to nie wystarczy, prawdopodobnie prosty skrypt jest lepszą opcją
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
lub coś bardziej rozbudowanego, aby uszanować klucze obce i zawrzeć cały zrzut tylko w jednej transakcji
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
Weź pod uwagę, że wyrażenie grep zakończy się niepowodzeniem, jeśli );
ciąg znaków znajduje się w jednej z kolumn
Aby go przywrócić (w bazie danych z tabelami już utworzonymi)
sqlite3 -bail database.db3 < /tmp/backup.sql