Revisione di altre possibili soluzioni
Includi solo INSERTI
sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'
Facile da implementare ma fallirà se una delle tue colonne include nuove linee
Modalità di inserimento SQLite
for t in $(sqlite3 $DB .tables); do
echo -e ".mode insert $t\nselect * from $t;"
done | sqlite3 $DB > backup.sql
Questa è una soluzione piacevole e personalizzabile, ma non funziona se le colonne hanno oggetti BLOB come il tipo "Geometria" in spatialite
Diff il dump con lo schema
sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -v -f schema.sql dump > data.sql
Non so perché, ma non funziona per me
Un'altra (nuova) soluzione possibile
Probabilmente non c'è una risposta migliore a questa domanda, ma una cosa che funziona per me è grep gli inserti tenendo conto che ci sono nuove righe nei valori della colonna con un'espressione come questa
grep -Pzo "(?s)^INSERT.*\);[ \t]*$"
Per selezionare le tabelle da scaricare, si .dump
ammette un argomento LIKE che corrisponda ai nomi delle tabelle, ma se questo non è abbastanza probabilmente un semplice script è l'opzione migliore
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
o, qualcosa di più elaborato per rispettare le chiavi esterne e incapsulare tutto il dump in una sola transazione
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
Tieni presente che l'espressione grep fallirà se );
è presente una stringa in una delle colonne
Per ripristinarlo (in un database con le tabelle già create)
sqlite3 -bail database.db3 < /tmp/backup.sql