Обзор других возможных решений
Включить только ВСТАВКИ
sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'
Легко реализовать, но не получится, если в любой из ваших столбцов появятся новые строки
Режим вставки SQLite
for t in $(sqlite3 $DB .tables); do
echo -e ".mode insert $t\nselect * from $t;"
done | sqlite3 $DB > backup.sql
Это хорошее и настраиваемое решение, но оно не работает, если у ваших столбцов есть объекты BLOB-объектов типа Geometry в пространственном объекте.
Diff the dump со схемой
sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -v -f schema.sql dump > data.sql
Не знаю почему, но у меня не работает
Другое (новое) возможное решение
Возможно, нет лучшего ответа на этот вопрос, но тот, который мне подходит, это grep вставки, принимая во внимание, что это новые строки в значениях столбцов с таким выражением
grep -Pzo "(?s)^INSERT.*\);[ \t]*$"
Для выбора таблиц .dump
допускается использование аргумента LIKE для соответствия именам таблиц, но если этого недостаточно, возможно, лучше использовать простой скрипт
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
или что-то более продуманное, чтобы уважать внешние ключи и инкапсулировать весь дамп только в одной транзакции
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
Учтите, что выражение grep не будет выполнено, если );
в каком-либо из столбцов присутствует строка
Восстановить его (в базе данных с уже созданными таблицами)
sqlite3 -bail database.db3 < /tmp/backup.sql