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

sqlite3 db .dump

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


当前回答

伸缩的答案应该是最接近的一个,但它并不适用于我的情况。一个插入查询中途中断,导出就停止了。不知道是什么原因。但是,它在.dump期间工作正常。

最后我写了一个工具来分解.dump生成的SQL:

https://github.com/motherapp/sqlite_sql_parser/

其他回答

根据命令行Shell的SQLite文档,对于SQLite,您可以将一个SQLite表(或表的一部分)导出为CSV,只需将“mode”设置为“CSV”,然后运行查询来提取表中所需的行:

sqlite> .header on
sqlite> .mode csv
sqlite> .once c:/work/dataout.csv
sqlite> SELECT * FROM tab1;
sqlite> .exit

然后使用"。import"命令导入CSV(逗号分隔值)数据到SQLite表中。

sqlite> .mode csv
sqlite> .import C:/work/dataout.csv tab1
sqlite> .exit

请阅读关于这两种情况的进一步文档,以考虑:(1)表“tab1”以前不存在,(2)表“tab1”已经存在。

你可以获取.schema和.dump命令的不同。例如,使用grep:

sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -vx -f schema.sql dump.sql > data.sql

数据。SQL文件将只包含没有模式的数据,就像这样:

BEGIN TRANSACTION;
INSERT INTO "table1" VALUES ...;
...
INSERT INTO "table2" VALUES ...;
...
COMMIT;

任何建议使用grep排除CREATE行或仅从sqlite3 $DB .dump输出中获取INSERT行的答案都将严重失败。CREATE TABLE命令每行列出一列(因此排除CREATE不会得到全部),INSERT行上的值可以有嵌入的换行符(因此不能只获取INSERT行)。

for t in $(sqlite3 $DB .tables); do
    echo -e ".mode insert $t\nselect * from $t;"
done | sqlite3 $DB > backup.sql

在sqlite3 3.6.20版本上测试。

如果你想排除某些表,你可以用$(sqlite $DB .tables | grep -v -e one -e two -e three)过滤它们,或者如果你想获得一个特定的子集,用one two three替换它。

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

最好的方法是采用sqlite3 db转储所做的代码,不包括模式部分。

示例伪代码:

SELECT 'INSERT INTO ' || tableName || ' VALUES( ' || 
  {for each value} ' quote(' || value || ')'     (+ commas until final)
|| ')' FROM 'tableName' ORDER BY rowid DESC

有关实际代码,请参阅:src/shell.c:838(用于sqlite-3.5.9)

您甚至可以取下外壳并注释掉模式部分并使用它。