Revisão de outras soluções possíveis
Incluir apenas INSERTs
sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'
Fácil de implementar, mas falhará se alguma de suas colunas incluir novas linhas
Modo de inserção SQLite
for t in $(sqlite3 $DB .tables); do
echo -e ".mode insert $t\nselect * from $t;"
done | sqlite3 $DB > backup.sql
Essa é uma solução agradável e personalizável, mas não funciona se suas colunas tiverem objetos de blob como o tipo 'Geometria' em espacialidade
Difere o despejo com o esquema
sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -v -f schema.sql dump > data.sql
Não sei por que, mas não está funcionando para mim
Outra (nova) solução possível
Provavelmente não há uma resposta melhor para essa pergunta, mas uma que está funcionando para mim é grep as inserções, levando em consideração que há novas linhas nos valores da coluna com uma expressão como esta
grep -Pzo "(?s)^INSERT.*\);[ \t]*$"
Para selecionar as tabelas a serem despejadas, .dump
admite um argumento LIKE para corresponder aos nomes das tabelas, mas se isso não for suficiente, provavelmente um script simples é a melhor opção
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, algo mais elaborado para respeitar chaves estrangeiras e encapsular todo o despejo em apenas uma transação
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
Leve em consideração que a expressão grep falhará se );
houver uma string presente em qualquer uma das colunas
Para restaurá-lo (em um banco de dados com as tabelas já criadas)
sqlite3 -bail database.db3 < /tmp/backup.sql