将SQLite3转储文件导入回数据库

49

我觉得这是一个愚蠢的问题,因为它看起来像是常识……但是我找不到任何能够给我答案的谷歌搜索!

我知道如何使用.dump命令从sqlite3数据库中获取数据。但现在我有了一个名为export.sqlite3.sql的ASCII文件……我似乎无法将它放回我想要的数据库中。

我的目标是将一个Rails应用中的数据转移到另一个应用程序中,这样我就不必花费大量时间再创建虚拟数据了……所以我从第一个应用程序中导出了数据,删除了所有CREATE TABLE语句,并确保我的第二个应用程序的架构匹配……现在我只需要把它导入进去。

有人可以帮助我吗?当你找到方法时,请告诉我你在谷歌上输入了什么,因为我现在正在用勺子敲击我的头。

4个回答

74

35
优秀的回答。冒着重复之音的风险,这是对 cat 命令无用的使用。重定向才是解决方案: sqlite3 my_database.sqlite < dumpfile.sql你也可以通过管道实现整个操作: sqlite3 old_database.sqlite .dump | sqlite3 my_database.sqlite - converter42
2
我同意,我通常也在<表单中使用它。只是想要明确一下。实际上,我修改了文档中使用zcat的示例。 - Ali Afshar
4
在运行此操作之前,我建议将“PRAGMA journal_mode = OFF; PRAGMA synchronous = OFF;”添加到转储文件的开头。这会使恢复过程更快。显然,在实际使用恢复的数据库时,这些设置不应该为OFF。 - Brian
1
60 MB,220,000行,在10秒钟内预置 "PRAGMA journal_mode = OFF; PRAGMA synchronous = OFF;",感谢@Brian。 - Paul

56

你没有指定你的操作系统,而

sqlite3 my_database.sqlite < export.sqlite3.sql

这个方法适用于Unix系统,但不适用于Windows。

.dump命令的反操作是.read命令。语法如下:

sqlite3> .read export.sqlite3.sql

Unix的命令无法运行...你使用这个进行了还原吗? - Java Man
1
是的,但请注意sqlite3>不是Unix命令,而是sqlite3提示符。 - Noah
我已经找到了解决方案,没有使用导出语句它就可以恢复。无论如何还是谢谢。 - Java Man
1
在Windows上似乎echo .dump | sqlite3 sourcedb.sqlite | sqlite3 targetdb.sqlite可以工作... - mdisibio
为什么我需要导入数据库的转储文件?我不能直接使用database.db文件吗? - JohnyTex

3

这也应该可以工作:

echo '.read export.sqlite3.sql' | sqlite3 my_database.sqlite3

一种可能比“sqlite3 my_database.sqlite3 < export.sqlite3.sql”更有优势的方法是,SQLite的.read命令可能(现在或将来)比仅仅“读取所有文本并执行它”的方法更先进。 它可能会进行分批处理,从而减少大型导出时的内存使用。不过我承认,这是一个相当晦涩和不太可能的优势。很可能,.read只是从输入中读取每一行并执行它,就像重定向和管道运算符一样。

错误:无法打开“export./home/ubuntu/trydatabase/newsql.sql”使用此命令。 - Java Man

-3

适用于Unix系统。

按下Ctrl+Alt+T并输入以下内容:

sqlite3 /home/ubuntu/output.sqlite < /home/ubuntu/input.sql

它可以从输入文件中恢复您的数据库。


1
在所有 Unix 口味上,“Ctrl+alt+T” 键的作用是什么? - mwfearnley
它打开终端。 - M. Mimpen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接