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

sqlite3 db .dump

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


当前回答

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

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

——或

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

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

其他回答

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

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

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

注意,这不包括模式。

你还没说你想怎么处理被丢弃的文件。

获取CSV文件(可以导入到几乎所有文件中)

.mode csv 
-- use '.separator SOME_STRING' for something other than a comma.
.headers on 
.out file.csv 
select * from MyTable;

获取一个SQL文件(可以重新插入到不同的SQLite数据库中)

.mode insert <target_table_name>
.out file.sql 
select * from MyTable;

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

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

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

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

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

——或

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

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

最好的方法是采用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)

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