Überprüfung anderer möglicher Lösungen
Schließen Sie nur INSERTs ein
sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'
Einfach zu implementieren, schlägt jedoch fehl, wenn eine Ihrer Spalten neue Zeilen enthält
SQLite-Einfügemodus
for t in $(sqlite3 $DB .tables); do
echo -e ".mode insert $t\nselect * from $t;"
done | sqlite3 $DB > backup.sql
Dies ist eine nette und anpassbare Lösung, die jedoch nicht funktioniert, wenn Ihre Spalten Blob-Objekte wie den Typ "Geometrie" in Spatialite enthalten
Diff den Dump mit dem Schema
sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -v -f schema.sql dump > data.sql
Ich weiß nicht warum, aber es funktioniert nicht für mich
Eine andere (neue) mögliche Lösung
Wahrscheinlich gibt es keine beste Antwort auf diese Frage, aber eine, die für mich funktioniert, ist das Grep der Einfügungen unter Berücksichtigung neuer Zeilen in den Spaltenwerten mit einem Ausdruck wie diesem
grep -Pzo "(?s)^INSERT.*\);[ \t]*$"
Um die Tabellen auszuwählen, die ausgegeben werden sollen, wird .dump
ein LIKE-Argument zugelassen, das mit den Tabellennamen übereinstimmt. Wenn dies jedoch nicht ausreicht, ist wahrscheinlich ein einfaches Skript die bessere Option
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
oder etwas ausgefeilteres, um Fremdschlüssel zu respektieren und den gesamten Speicherauszug in nur einer Transaktion zu kapseln
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
Berücksichtigen Sie, dass der grep-Ausdruck fehlschlägt, wenn );
in einer der Spalten eine Zeichenfolge vorhanden ist
So stellen Sie es wieder her (in einer Datenbank mit den bereits erstellten Tabellen)
sqlite3 -bail database.db3 < /tmp/backup.sql