如何使用sqlite3.exe命令行工具自动化进程?

dav*_*ave 54 sqlite scripting batch-file

我正在尝试将大量数据(550万行)批量加载到SQLite数据库文件中.通过INSERT加载似乎太慢了,所以我试图使用sqlite3命令行工具和.import命令.

如果我手动输入命令,它可以很好地工作,但我不能为我的生活找出如何从脚本(.bat文件或python脚本;我在Windows机器上工作)自动化它.

我在命令行发出的命令是:

> sqlite3 database.db
sqlite> CREATE TABLE log_entry ( <snip> );
sqlite> .separator "\t"
sqlite> .import logfile.log log_entry
Run Code Online (Sandbox Code Playgroud)

但是我尝试的任何东西都不会从bat文件或python脚本中运行.

我一直在尝试这样的事情:

sqlite3 "database.db" .separator "\t" .import logfile.log log_entry

echo '.separator "\t" .import logfile.log log_entry' | sqlite3 database.db
Run Code Online (Sandbox Code Playgroud)

当然我能以某种方式做到这一点?

Joe*_*oey 53

使用要在sqlite命令行程序中输入的行创建一个文本文件,如下所示:

CREATE TABLE log_entry (  );
.separator "\t"
.import logfile.log log_entry

然后打电话 sqlite3 database.db < commands.txt

  • 你的解决方案是正确的,我被卡住了,因为你在 dot 之前不能有任何空格。脚本中的命令。供参考 (2认同)

nad*_*000 25

或者,您可以使用heredoc import.sh将所有内容放在一个shell脚本文件中(从而简化维护):

#!/bin/bash --
sqlite3 -batch $1 <<"EOF"
CREATE TABLE log_entry ( <snip> );
.separator "\t"
.import logfile.log log_entry
EOF
Run Code Online (Sandbox Code Playgroud)

...并运行它:

import.sh database.db
Run Code Online (Sandbox Code Playgroud)

它使维护一个脚本文件变得更容易.顺便说一句,如果您需要在Windows下运行它,Power Shell还具有heredoc功能

此外,此方法有助于处理缺少脚本参数支持.您可以使用bash变量:

#!/bin/bash --

table_name=log_entry

sqlite3 -batch $1 <<EOF
CREATE TABLE ${table_name} ( <snip> );
.separator "\t"
.import logfile.log ${table_name}
EOF
Run Code Online (Sandbox Code Playgroud)

甚至做这样的伎俩:

#!/bin/bash --

table_name=$2

sqlite3 -batch $1 <<EOF
CREATE TABLE ${table_name} ( <snip> );
.separator "\t"
.import logfile.log ${table_name}
EOF
Run Code Online (Sandbox Code Playgroud)

...并运行它: import.sh database.db log_entry


Mih*_*șan 17

创建一个单独的文本文件,其中包含您通常在sqlite3 shell应用程序中键入的所有命令:

CREATE TABLE log_entry ( <snip> );
.separator "\t"
.import /path/to/logfile.log log_entry
Run Code Online (Sandbox Code Playgroud)

保存为,例如,impscript.sql.

创建一个批处理文件,该文件使用该脚本调用sqlite3 shell:

sqlite3.exe yourdatabase.db < /path/to/impscript.sql
Run Code Online (Sandbox Code Playgroud)

调用批处理文件.

在旁注 - 导入时,请确保在事务中包装INSERT!这将为您提供10.000%的即时加速.


小智 6

sqlite3 abc.db ".read scriptname.sql"
Run Code Online (Sandbox Code Playgroud)

  • 欢迎来到堆栈溢出!虽然此代码片段可以解决问题,但包括解释[确实有帮助](//meta.stackexchange.com/q/114762) 以提高帖子的质量。请记住,您是在为将来的读者回答问题,而不仅仅是现在提问的人!请[编辑]您的答案以添加解释,并指出适用的限制和假设。 (2认同)

小智 5

我最近在将Firefox的cookies.sqlite转换为文本文件(对于某些下载工具)时遇到了类似的问题,并偶然发现了这个问题.

我想用一个shell线来做这个,这将是我的解决方案应用于上述问题:

echo -e ".mode tabs\n.import logfile.log log_entry" | sqlite3 database.db
Run Code Online (Sandbox Code Playgroud)

但我还没有测试过那条线.但它在我上面提到的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
Run Code Online (Sandbox Code Playgroud)