如何在单行 shell 命令中将多个命令传递给 sqlite3

ken*_*enn 8 bash shell-script sqlite bash-expansion

我正在尝试将剪贴板内容保存到 sqlite 数据库中。创建数据库和表。

我不希望它journal在每次剪贴板更改时都创建文件,所以我尝试传递PRAGMA journal_mode = OFF;标志。但是在单行命令中传递这些命令很棘手,因为sqlite只接受两个命令,例如

sqlite3 clipboard_archive.db "insert into cb (cb_context) values ('clipboard');"
Run Code Online (Sandbox Code Playgroud)

有用。我寻找Q&A网站,一些建议以下列方式回显命令。

echo "PRAGMA journal_mode = OFF;" | sqlite3 clipboard_archive.db "insert into cb (cb_context) values ('clipboard');"
Run Code Online (Sandbox Code Playgroud)

但是PRAGMA journal_mode = OFF;虽然它在sqlite3命令提示符下工作,但不会以这种方式生效。

我的一个班轮脚本有什么问题?

jco*_*ctx 13

derobert的答案似乎不适用于点命令,但您可以使用-cmdsqlite3 tolls.sql3 -cmd ".mode csv" ".import tolls.csv tolls"

它接受多个-cmd命令并在最终 arg 之前按顺序执行它们。

  • 在 Windows 上,如果您安装 sqlite3,您可以传递不带 -cmd 参数的点命令,即:`sqlite3 some.db ".separator ','" ".import table1.csv table1" ".import table2.csv table2"` I知道这与 UNIX 无关,但我想包含此评论,以防人们在网上找到这篇文章并且他们在 Windows 上。 (2认同)

der*_*ert 8

如果您不想要日志,不确定为什么要使用 SQLite(如果考虑速度,您是否考虑过更快的 WAL 模式?)但您可以给出多个用分号分隔的命令:

sqlite3 clipboard_archive.db "PRAGMA journal_mode = OFF; insert into cb (cb_context) values ('clipboard');"
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以运行\xe2\x80\xa6

\n
$ sqlite3 <database_file> \'<statement_1>\' [\'<statement_n>\']\n
Run Code Online (Sandbox Code Playgroud)\n

示例\xe2\x80\xa6

\n
$ sqlite3 data.db \'.mode json\' \'select * from my_table\'\n
Run Code Online (Sandbox Code Playgroud)\n