Огляд інших можливих рішень
Включайте лише ВСТАВКИ
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
Це приємне та налаштоване рішення, але воно не працює, якщо у ваших стовпцях у просторі є об'єкти, що перебувають у формі "Геометрія".
Розріжте дамп із схемою
sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -v -f schema.sql dump > data.sql
Не знаю чому, але не працює для мене
Ще одне (нове) можливе рішення
Напевно, немає найкращої відповіді на це запитання, але одна, яка працює для мене, - це греп вставки, враховуючи, що це нові рядки у значеннях стовпця з виразом, як це
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