审查其他可能的解决方案
仅包括 INSERT
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
这是一个不错且可自定义的解决方案,但如果您的列在 spatialite 中具有像“几何”类型这样的 blob 对象,则它不起作用
用架构区分转储
sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -v -f schema.sql dump > data.sql
不知道为什么,但对我不起作用
另一种(新的)可能的解决方案
这个问题可能没有最佳答案,但对我有用的是 grep 插入,考虑到列值中的新行,expression like this
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