sqlite数据库 - sqlite输出




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

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

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

然后只需调用sqlite3 database.db < commands.txt

我正在尝试将大量数据(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

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

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

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

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

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


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

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

保存为,例如,impscript.sql。

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

sqlite3.exe yourdatabase.db < /path/to/impscript.sql

调用批处理文件。

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


在这一点上,我不确定除了之外我还能添加什么,我在向nad2000建议的bash脚本中添加unix环境变量时遇到了一些麻烦。

运行这个:

bash dbmake.sh database.db <(sed '1d' $DATA/logfile.log | head -n 1000)

我需要从stdin导入作为解决方法,我找到了这个解决方案:

sqlite3 $1 <<"EOF"
CREATE TABLE log_entry;
EOF
sqlite3 -separator $'\t' $1 ".import $2 log_entry"

通过添加第二个sqlite3行,我能够将$ 2中的$ 2传递给.import,完整路径和所有内容的文件参数。


我最近在将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

sqlite3 abc.db ".read scriptname.sql"

   here trans is table name and trans.csv is a csv file in which i have 1959 rows of data

    $ sqlite3 abc.db ".separator ','"
    $ sqlite3 abc.db ".import 'trans.csv' trans"
    $ sqlite3 abc.db "select count(*) from trans;"
    1959

但它不可能像你写的那样写







batch-file