Revisión de otras posibles soluciones.
Incluir solo INSERTOS
sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'
Fácil de implementar pero fallará si alguna de sus columnas incluye nuevas líneas
Modo de inserción de SQLite
for t in $(sqlite3 $DB .tables); do
echo -e ".mode insert $t\nselect * from $t;"
done | sqlite3 $DB > backup.sql
Esta es una solución agradable y personalizable, pero no funciona si sus columnas tienen objetos blob como el tipo 'Geometry' en spaceialite
Difunde el basurero con el esquema
sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -v -f schema.sql dump > data.sql
No estoy seguro de por qué, pero no funciona para mí.
Otra (nueva) posible solución
Probablemente no haya una mejor respuesta a esta pregunta, pero una que funciona para mí es grep las inserciones teniendo en cuenta que hay nuevas líneas en los valores de columna con una expresión como esta
grep -Pzo "(?s)^INSERT.*\);[ \t]*$"
Para seleccionar las tablas que se descartan, se .dump
admite un argumento LIKE para que coincida con los nombres de las tablas, pero si esto no es suficiente, probablemente un script simple sea una mejor opción
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 algo más elaborado para respetar las claves externas y encapsular todo el volcado en una sola transacción
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
Tenga en cuenta que la expresión grep fallará si );
hay una cadena presente en cualquiera de las columnas
Para restaurarlo (en una base de datos con las tablas ya creadas)
sqlite3 -bail database.db3 < /tmp/backup.sql