Examen des autres solutions possibles
Inclure uniquement les INSERTs
sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'
Facile à mettre en œuvre mais échouera si l'une de vos colonnes inclut de nouvelles lignes
Mode d'insertion SQLite
for t in $(sqlite3 $DB .tables); do
echo -e ".mode insert $t\nselect * from $t;"
done | sqlite3 $DB > backup.sql
C'est une solution agréable et personnalisable, mais cela ne fonctionne pas si vos colonnes ont des objets blob comme le type 'Geometry' dans spatialite
Différer le vidage avec le schéma
sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -v -f schema.sql dump > data.sql
Je ne sais pas pourquoi, mais ne fonctionne pas pour moi
Une autre (nouvelle) solution possible
Il n'y a probablement pas de meilleure réponse à cette question, mais celle qui fonctionne pour moi est de grep les insertions en tenant compte du fait qu'il y a de nouvelles lignes dans les valeurs de colonne avec une expression comme celle-ci
grep -Pzo "(?s)^INSERT.*\);[ \t]*$"
Pour sélectionner les tables à vider, .dump
admet un argument LIKE pour correspondre aux noms de table, mais si cela ne suffit pas, un simple script est probablement la meilleure 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
ou quelque chose de plus élaboré pour respecter les clés étrangères et encapsuler tout le vidage en une seule transaction
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
Tenez compte du fait que l'expression grep échouera si );
une chaîne est présente dans l'une des colonnes
Pour le restaurer (dans une base de données avec les tables déjà créées)
sqlite3 -bail database.db3 < /tmp/backup.sql