我需要一种简单的方法来从包含多个表的 SQLite 数据库中导出数据,然后将它们导入到另一个数据库中。
这是我的场景。我有 5 张桌子:A、B、C、D、E。
每个表都有一个主键作为第一列,称为 ID。我想要一个 Unix 命令,它仅以可以导入到另一个数据库的格式转储主键行中的数据。
我知道我可以做一个
sqlite3 db .dump | grep INSERT
但这给了我表中的所有数据。我不是数据库专家,我尝试使用所有可以编写 shell 脚本的 unix 命令来执行此操作,而不是编写 C++ 代码来执行此操作(因为人们告诉我这是最简单的方法) 。我只是拒绝编写 C++ 代码来完成可以通过命令行 4-5 条语句完成的任务。
有什么建议吗?
这可能看起来有点奇怪,但是你可以尝试一下:
创建文本文件并在其中放置以下语句:
.mode insert
.output insert.sql
select * from TABLE where STATEMENT; -- place the needed select query here
.output stdout
将此文件输入到 sqlite3:
$ sqlite3 -init initf DATA.DB .schema > schema.sql
结果,您将得到两个文件:一个带有简单的“插入”(insert.sql),另一个带有数据库模式(schema.sql)。
建议找到一个可以将您的查询导出到 CSV 的工具。听起来你想要一个剧本。您想重用并自动化它吗?
对于其他场景,也许可以考虑 sqlite-manager Firefox 插件。它支持运行即席查询并将结果导出到 CSV。
其中,给出以下声明:
SELECT ID FROM TableA
根据需要对每个表重复此操作。
您可以使用sqlite3 bash。例如,如果您想获得一张表中所有记录的
insert
查询,您可以执行以下操作:
$ sqlite3 /path/to/db_name.db
>>.mode insert
>>.output insert.sql
>>select * from table_name;
它将创建一个名为
insert.sql
的文件,并对给定表中的每条记录进行 insert
查询。
您所获得的样本
insert.sql
:
INSERT INTO "table" VALUES("data for record one");
INSERT INTO "table" VALUES("data for record two");
..
您还可以使用SQLite的
quote
功能。
echo "SELECT 'INSERT INTO my_new_table (my_new_key) VALUES (' || quote(my_old_key) || ');' FROM my_old_table;" | sqlite my_table > statements.sql
例如,您可以使用以下命令仅将
apple.db
中特定表的数据导出到backup.sql
。 *.output
根据文件存在创建并选择或仅选择文件,并且您必须退出才能关闭文件(例如,.exit
或.quit
),否则SQLite命令的结果将输出到文件中:
sqlite3 apple.db
sqlite> .mode insert
sqlite> .output backup.sql
sqlite> SELECT * FROM person, animal;
sqlite> .exit
*我的回答解释了如何导出架构和数据。