如何转储数据库的一些SQLite3表(而不是所有表)的数据,并且只转储数据,而不转储模式? 转储应该是SQL格式的,因为它以后可以很容易地重新输入到数据库中,并且应该从命令行完成。类似的

sqlite3 db .dump

但是没有转储模式和选择要转储的表。


当前回答

您可以为.dump特殊命令指定一个或多个表参数,例如sqlite3 db "。Dump 'table1' 'table2' '”。

其他回答

不是最好的方法,但至少不需要外部工具(除了grep,它是*nix盒子上的标准)

sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'

但是您确实需要为您正在寻找的每个表执行这个命令。

注意,这不包括模式。

作为对Paul Egan的回答的改进,这可以实现如下:

sqlite3 database.db3 '.dump "table1" "table2"' | grep '^INSERT'

——或

sqlite3 database.db3 '.dump "table1" "table2"' | grep -v '^CREATE'

当然,需要注意的是必须安装grep。

审查其他可能的解决方案

只包含插入

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中有像“Geometry”类型的blob对象,它就不起作用了

区别转储和模式

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

这个版本在插入的换行中工作得很好:

数据库sqlite3。sqlite3 .dump | grep '^CREATE'

实际上排除了所有以CREATE开头的行,这样不太可能包含换行符

您可以对表进行选择,在每个字段后插入逗号以生成csv,或者使用GUI工具返回所有数据并将其保存为csv。