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

w3nuxt5m  于 2023-06-23  发布在  SQLite
关注(0)|答案(8)|浏览(523)

当我使用-cmd选项和SQLite3运行查询时,SQLite3打开数据库并等待交互式输入。如何从命令行对SQLite3运行查询并退出?

ezykj2lf

ezykj2lf1#

只需要在数据库文件参数后面用引号括起命令即可。
例如,下面的命令创建了一个名为abc的表:

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

slsn1g292#

您可以使用.exit命令(1)正常退出:

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

文件:Command Line Shell For SQLite

ix0qys7i

ix0qys7i3#

如果在命令行运行SQLite 3时,你遇到了“必须”使用-cmd标志的情况,你可以使用连续的 blank 命令退出。
例如:

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

在本例中,""将导致SQLite 3进程退出。(至少在OS X上是这样的。

vngu2lb8

vngu2lb84#

使用多行查询也可能很有用:

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

ehxuflar5#

正如问题所述,我们也可以使用'-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

注:在破折号和bash中测试。也应该在zsh,fish等玩。

2ledvvac

2ledvvac6#

有查询和点命令。
我们可以传递什么给sqlite3?让我们检查一下。

% sqlite3 --help
Usage: sqlite3 [OPTIONS] FILENAME [SQL]

我们也可以使用点命令代替[SQL]。但是,可能有一些例外,我不知道。
要列出所有点命令,请运行:

sqlite3 test.sqlite .help

这里,test.sqliteFILENAME
要查看数据库的架构,请运行:

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

**注意:**从前面的例子中可以看出,如果使用-cmd,我们只需要使用.quit.exit。否则,不需要。

ugmeyewa

ugmeyewa7#

    • 以下命令插入一行到person表**,然后读取**db.sqlite3数据库中的person表**,然后立即退出。*".exit"命令不需要退出,因为所有查询完成后,sqlite会自动退出:
sqlite3 db.sqlite3 "INSERT INTO person VALUES ('John');" "SELECT * FROM person;"
up9lanfz

up9lanfz8#

一般命令语法

这让我有点困惑,部分原因是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

因此,下面的退出没有交互式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,因为它们有0个SQL命令:

sqlite3
sqlite3 -cmd "select col1 from t" -cmd "select col2 from t" db.sqlite3

因此,我们看到-cmd所做的是允许运行SQL语句,同时在最后仍然获得交互式shell。

要在没有DB的情况下运行查询并退出,可以使用magic :memory:临时内存数据库

例如,这对于快速功能测试非常有用:

sqlite3 ':memory:' 'select 1 + 1'

相关问题