当我使用 SQLite3 的
-cmd
选项来运行查询时,SQLite3 打开数据库并等待交互式输入。如何从命令行在 SQLite3 上运行查询并退出?
只需将命令放在数据库文件参数后面的引号中即可。
例如,以下创建一个名为
abc
的表:
sqlite3 test.db 'create table abc (col0 int)'
如果您在从命令行运行 SQLite 3 时陷入绝对“必须”使用
-cmd
标志的情况,则可以使用连续的 blank 命令退出。
例如:
sqlite3 test.db "select * from urls;" "" > test.txt
在此示例中,
""
将导致 SQLite 3 进程退出。 (至少在 OS X 上对我来说是这样。)
多行查询也可能很有用:
sqlite3 ./database.db <<EOF
SELECT *
FROM something
LIMIT 5
EOF
一般命令语法
这让我有点困惑,因为
man sqlite3
使用了一种奇怪的符号,所以这里,更常见的类似 GNU 的符号的语法是:
sqlite3 [opt]... [<db> [sql]...]
这意味着第一个不带破折号的参数
-
必须是数据库名称。
然后,每个其他参数都是在该数据库上发生的单独的 SQL 语句。
一些有效的示例命令:
sqlite3
sqlite3 db.sqlite3
sqlite3 db.sqlite3 "select * from t"
sqlite3 db.sqlite3 "select col1 from t" "select col2 from t"
sqlite3 db.sqlite3 "select col1 from t; select col2 from t"
sqlite3 -line
sqlite3 -line db.sqlite3
sqlite3 -line db.sqlite3 "select * from t"
sqlite3 -line db.sqlite3 "select col1 from t" "select col2 from t"
sqlite3 db.sqlite3 ".schema"
sqlite3 db.sqlite3 ".schema" "select * from t"
如果有一个或多个位置
sql
命令,那么最后没有交互式shell
因此以下退出没有交互式外壳:
sqlite3 db.sqlite3 "select col1 from t"
:一条SQL语句sqlite3 db.sqlite3 "select col1 from t" "select col2 from t"
:两条SQL语句sqlite3 db.sqlite3 ".schema"
:一条SQL语句sqlite3 db.sqlite3 ".schema" "select col1 from t"
:两条SQL语句但是以下命令打开交互式 shell,因为它们没有位置 SQL 命令:
sqlite3
sqlite3 -cmd "select col1 from t" -cmd "select col2 from t" db.sqlite3
所以我们看到
-cmd
的作用是允许运行 SQL 语句,同时最终仍然获得交互式 shell。
如果命令来自非交互式标准输入(例如管道),那么最后也没有交互式 shell
例如这会立即退出:
echo 'select 1' | sqlite3
要在没有数据库的情况下运行查询并退出,您可以使用魔法
:memory:
临时内存数据库
例如这对于快速功能测试很有用:
sqlite3 ':memory:' 'select 1 + 1'
如果您真的想炫耀,您也可以将其与 CTE 结合使用,通过单个语句来展示您的
SELECT
技能:
sqlite3 ':memory:' 'WITH t (i, j) AS (VALUES (1, -1), (2, -2)) SELECT * FROM t'
仅当您想在 stdin 之前运行命令时才需要 -cmd
例如对我来说,一个常见的用例是在通过 Bash EOF 从 stdin 运行大型命令之前
.mode csv
,例如:
sqlite3 db.sqlite3 -cmd '.mode csv' <<EOF
SELECT * FROM (
SELECT * FROM (
SELECT * FROM t
)
)
EOF
正如问题中提到的,我们还可以使用“-cmd”选项并......在最后应用一些shell“魔法”(模仿用户手册“退出”)。让我们评估一个 sql 表达式:
#!/bin/sh
sqlite3 -cmd "select 5.0/2;" < `echo ".exit"`
2.5
当我们还必须提交“.xxx”sqlite 元命令(即 .show 或 .stat)时,这种方法是有效的:
sqlite3 -cmd ".stat" < `echo ".exit"`
Memory Used: 0 (max 56) bytes
Number of Outstanding Allocations: 0 (max 2)
Number of Pcache Overflow Bytes: 0 (max 0) bytes
Largest Allocation: 40 bytes
Largest Pcache Allocation: 0 bytes
Bytes received by read(): 10992
Bytes sent to write(): 253
Read() system calls: 19
Write() system calls: 6
Bytes read from storage: 0
Bytes written to storage: 0
Cancelled write bytes: 0
注意:在 dash 和 bash 中测试。还应该玩 zsh、fish 等
有查询,有点命令。
我们可以传递什么给
sqlite3
?让我们检查一下。
% sqlite3 --help
Usage: sqlite3 [OPTIONS] FILENAME [SQL]
我们还可以使用点命令代替
[SQL]
。但是,可能会有一些我不知道的例外情况。
要列出所有点命令,请运行:
sqlite3 test.sqlite .help
这里,
test.sqlite
是FILENAME
。
要查看数据库的架构,请运行:
sqlite3 test.sqlite .schema
要列出数据库的所有表,请运行:
sqlite3 test.sqlite .tables
如果您必须使用
-cmd
那么命令将如下所示:
sqlite3 -cmd .tables test.sqlite .quit
现在您可以使用以下命令对数据库运行查询:
sqlite3 test.sqlite "select * from DATABASE_NAME"
如果您必须使用
-cmd
那么命令将如下所示:
sqlite3 -cmd "select * from object_store" test.sqlite .quit
您可能已经注意到,当使用
-cmd
时,我们使用了多个命令。是的,我们可以这样做:
sqlite3 test.sqlite ".print The Tables Are:\n" ".tables" ".print \nThe Schema is:\n" ".schema" ".print \nList Of All Customers:\n" "select * from customers"
如果您必须使用
-cmd
那么命令将如下所示:
sqlite3 -cmd ".print The Tables Are:\n" -cmd ".tables" -cmd ".print \nThe Schema is:\n" -cmd ".schema" -cmd ".print \nList Of All Customers:\n" -cmd "select * from object_store" test.sqlite .quit
注意:从前面的示例中我们可以看到,如果您使用
.quit
,我们只需要使用.exit
或-cmd
。否则不需要。
下面的命令会向
person
表插入一行,然后在person
数据库中读取db.sqlite3
表,然后立即退出。 *".exit"
命令不需要退出,因为所有查询完成后,sqlite自动退出:
sqlite3 db.sqlite3 "INSERT INTO person VALUES ('John');" "SELECT * FROM person;"