如何运行命令行SQLite查询并退出?

问题描述 投票:0回答:8

当我使用 SQLite3 的

-cmd
选项来运行查询时,SQLite3 打开数据库并等待交互式输入。如何从命令行在 SQLite3 上运行查询并退出?

sqlite shell command-line
8个回答
126
投票

只需将命令放在数据库文件参数后面的引号中即可。

例如,以下创建一个名为

abc
的表:

sqlite3 test.db 'create table abc (col0 int)'

54
投票

您可以使用

.exit
命令(1),优雅地退出:

sqlite3 test.db "select * from abc;" ".exit"

文档:SQLite 的命令行外壳


6
投票

如果您在从命令行运行 SQLite 3 时陷入绝对“必须”使用

-cmd
标志的情况,则可以使用连续的 blank 命令退出。

例如:

sqlite3 test.db "select * from urls;" "" > test.txt

在此示例中,

""
将导致 SQLite 3 进程退出。 (至少在 OS X 上对我来说是这样。)


2
投票

多行查询也可能很有用:

sqlite3 ./database.db <<EOF
    SELECT *
    FROM something
    LIMIT 5
EOF

1
投票

一般命令语法

这让我有点困惑,因为

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

0
投票

正如问题中提到的,我们还可以使用“-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 等


0
投票

有查询,有点命令

我们可以传递什么给

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
。否则不需要。


0
投票

下面的命令会向

person
插入一行,然后在
person
数据库
中读取
db.sqlite3
,然后立即退出。 *
".exit"
命令
不需要退出,因为所有查询完成后,sqlite自动退出:

sqlite3 db.sqlite3 "INSERT INTO person VALUES ('John');" "SELECT * FROM person;"
© www.soinside.com 2019 - 2024. All rights reserved.