如何转储某些SQLite3表的数据?

时间:2020-03-05 18:56:50  来源:igfitidea点击:

如何转储数据库的某些SQLite3表(不是所有表)的数据,而仅转储数据,而不是模式?
转储应采用SQL格式,因为以后应轻松将其重新输入数据库并应从命令行完成。就像是

sqlite3 db .dump

但不转储架构并选择要转储的表。

解决方案

回答

我们可以在表格上进行选择,在每个字段后插入逗号以产生csv,或者使用GUI工具返回所有数据并将其保存到csv。

回答

最好的方法是采用sqlite3 db dump可以执行的代码,不包括模式部分。

伪代码示例:

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)

我们甚至可以只使用该shell并注释掉架构部分并使用它。

回答

我们没有说要对转储的文件做什么。

我将使用以下内容获取CSV文件,该文件可以导入几乎所有内容

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

如果我们想重新插入另一个SQLite数据库,则:

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

回答

这不是最好的方法,但至少不需要外部工具(grep除外,反正这在* nix盒上是标准的)

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

但是我们确实需要对要查找的每个表执行此命令。

请注意,这不包括架构。

回答

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