Обзор других возможных решений
Включить только вставки
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 в пространственном элементе
Развалить дамп со схемой
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