我正在尝试将大量数据(550万行)批量加载到SQLite数据库文件中.通过INSERT加载似乎太慢了,所以我试图使用sqlite3命令行工具和.import命令.
如果我手动输入命令,它可以很好地工作,但我不能为我的生活找出如何从脚本(.bat文件或python脚本;我在Windows机器上工作)自动化它.
我在命令行发出的命令是:
> sqlite3 database.db sqlite> CREATE TABLE log_entry (); sqlite> .separator "\t" sqlite> .import logfile.log log_entry
但是我尝试的任何东西都不会从bat文件或python脚本中运行.
我一直在尝试这样的事情:
sqlite3 "database.db" .separator "\t" .import logfile.log log_entry echo '.separator "\t" .import logfile.log log_entry' | sqlite3 database.db
当然我能以某种方式做到这一点?
使用要在sqlite命令行程序中输入的行创建一个文本文件,如下所示:
CREATE TABLE log_entry ( ); .separator "\t" .import logfile.log log_entry
然后打电话 sqlite3 database.db < commands.txt
或者,您可以使用heredoc import.sh将所有内容放在一个shell脚本文件中(从而简化维护):
#!/bin/bash -- sqlite3 -batch $1 <<"EOF" CREATE TABLE log_entry (); .separator "\t" .import logfile.log log_entry EOF
...并运行它:
import.sh database.db
它使维护一个脚本文件变得更容易.顺便说一句,如果您需要在Windows下运行它,Power Shell还具有heredoc功能
此外,此方法有助于处理缺少脚本参数支持.您可以使用bash变量:
#!/bin/bash -- table_name=log_entry sqlite3 -batch $1 <); .separator "\t" .import logfile.log ${table_name} EOF
甚至做这样的伎俩:
#!/bin/bash -- table_name=$2 sqlite3 -batch $1 <); .separator "\t" .import logfile.log ${table_name} EOF
...并运行它: import.sh database.db log_entry
创建一个单独的文本文件,其中包含您通常在sqlite3 shell应用程序中键入的所有命令:
CREATE TABLE log_entry (); .separator "\t" .import /path/to/logfile.log log_entry
保存为,例如,impscript.sql.
创建一个批处理文件,该文件使用该脚本调用sqlite3 shell:
sqlite3.exe yourdatabase.db < /path/to/impscript.sql
调用批处理文件.
在旁注 - 导入时,请确保在事务中包装INSERT!这将为您提供10.000%的即时加速.
我最近在将Firefox的cookies.sqlite转换为文本文件(对于某些下载工具)时遇到了类似的问题,并偶然发现了这个问题.
我想用一个shell线来做这个,这将是我的解决方案应用于上述问题:
echo -e ".mode tabs\n.import logfile.log log_entry" | sqlite3 database.db
但我还没有测试过那条线.但它在我上面提到的Firefox问题上运行良好(顺便说一下,在Mac OSX上通过Bash):
echo -e ".mode tabs\nselect host, case when host glob '.*' then 'TRUE' else 'FALSE' end, path, case when isSecure then 'TRUE' else 'FALSE' end, expiry, name, value from moz_cookies;" | sqlite3 cookies.sqlite