sqlite3 命令行工具
最后修改于 2020 年 7 月 6 日
在本 SQLite 教程中,我们将介绍 sqlite3
命令行工具。
sqlite3 工具
sqlite3
工具是一个基于终端的前端,用于 SQLite 库,它可以交互式地评估查询并将结果以多种格式显示。它也可以在脚本中使用。
在终端屏幕上,我们看到 sqlite3
工具的以下提示符
$ sqlite3 SQLite version 3.16.2 2017-01-06 16:32:41 Enter ".help" for usage hints. Connected to a transient in-memory database. Use ".open FILENAME" to reopen on a persistent database.
.help
命令是 sqlite3
工具的元命令之一;它列出所有元命令。 .exit
和 .quit
命令退出 sqlite3
会话。我们也可以使用 Ctrl+D 组合键来退出 sqlite3
。 .databases
命令显示已连接的数据库。 .tables
命令列出可用的表。
Ctrl+L 清除屏幕,Ctrl+U 清除当前行。(当使用 readline 库构建时。)
使用 sqlite3 创建数据库
完整的 SQLite 数据库存储在单个跨平台的磁盘文件中。我们使用 sqlite3
命令行工具创建一个新的数据库文件。
$ sqlite3 test.db
在这里,我们创建一个新的 test.db
数据库。如果该文件存在,则将其打开。
基本的 sqlite3 元命令
接下来,我们描述 sqlite3
工具的一些元命令。
sqlite> .tables Authors Cars Friends Reservations Books Customers Orders
.tables
命令显示可用的表。
sqlite> SELECT * FROM Friends; 1|Jane|F 2|Thomas|M 3|Franklin|M 4|Elisabeth|F 5|Mary|F 6|Lucy|F 7|Jack|M
在这里,我们获取 SELECT
语句的输出。默认情况下,输出模式为 line
,分隔符为 |
。
sqlite> .separator : sqlite> SELECT * FROM Friends; 1:Jane:F 2:Thomas:M 3:Franklin:M 4:Elisabeth:F 5:Mary:F 6:Lucy:F 7:Jack:M
在这里,我们使用了一个新的冒号分隔符。
有几种其他的输出模式可用。以下示例显示 column
输出模式。
sqlite> .mode column sqlite> .headers on sqlite> SELECT * FROM Friends; Id Name Sex ---------- ---------- ---------- 1 Jane F 2 Thomas M 3 Franklin M 4 Elisabeth F 5 Mary F 6 Lucy F 7 Jack M
此示例显示了如何在 sqlite 的列模式中格式化数据。 .headers
命令也被用来显示列标题。默认情况下,标题是隐藏的。
.width
命令调整列的大小。(此元命令仅与列模式下的表相关。)
sqlite> SELECT Name, Title FROM Authors NATURAL JOIN Books; Name Title ----------- ---------- Jane Austen Emma Leo Tolstoy War and Pe Joseph Hell Catch XII Charles Dic David Copp Joseph Hell Good as Go Leo Tolstoy Anna Karen
列宽不足以正确显示所有数据。
sqlite> .width 15 18 sqlite> SELECT Name, Title FROM Authors NATURAL JOIN Books; Name Title --------------- ------------------ Jane Austen Emma Leo Tolstoy War and Peace Joseph Heller Catch XII Charles Dickens David Copperfield Joseph Heller Good as Gold Leo Tolstoy Anna Karenia
在这里,我们更改列宽。第一列将是 15 个字符宽,第二列是 18 个字符宽。
sqlite> .shell clear
.shell
命令执行系统程序。在我们的例子中,我们使用 clear
命令清除屏幕。(在 Windows 上,等效命令是 cls
。)
sqlite> .show echo: off eqp: off explain: auto headers: on mode: column nullvalue: "" output: stdout colseparator: "|" rowseparator: "\n" stats: off width: 15 18 filename: testdb
.show
命令列出各种设置。这些包括输出模式、在列表模式中使用的分隔符以及标题是否开启。
sqlite> .schema Cars CREATE TABLE Cars(Id INTEGER PRIMARY KEY, Name TEXT, Price INTEGER);
.schema
命令显示表的结构。它给出用于创建表的 DDL SQL。
可以使用 .prompt
命令更改 sqlite3
的提示符。
sqlite> .prompt "> " ". " > SELECT * FROM Cars . LIMIT 2; Id Name Price ---------- ---------- ---------- 1 Audi 52642 2 Mercedes 57127 >
有两个提示符。一个是主提示符,另一个是延续提示符。默认的主提示符是 sqlite>
,默认的延续提示符是 ...>
。
从 shell 执行 SQL
我们可以从 shell 执行 SQL 命令。
$ sqlite3 test.db "SELECT * FROM Cars;" 1|Audi|52642 2|Mercedes|57127 3|Skoda|9000 4|Volvo|29000 5|Bentley|350000 6|Citroen|21000 7|Hummer|41400 8|Volkswagen|21600
在这里,我们以非交互方式执行了一个 SELECT
语句;从 Cars
表中选择了所有汽车。
转储表
可以将表以 SQL 格式转储到磁盘。通过这种方式,我们可以轻松地保存数据库表的结构和数据。
我们有 Cars 表。
sqlite> SELECT * FROM Cars; Id Name Price ---------- ---------- ---------- 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 6 Citroen 21000 7 Hummer 41400 8 Volkswagen 21600
我们将使用 .dump
命令来转储该表。
sqlite> .dump Cars PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; CREATE TABLE Cars(Id INTEGER PRIMARY KEY, Name TEXT, Price INTEGER); INSERT INTO "Cars" VALUES(1,'Audi',52642); INSERT INTO "Cars" VALUES(2,'Mercedes',57127); INSERT INTO "Cars" VALUES(3,'Skoda',9000); INSERT INTO "Cars" VALUES(4,'Volvo',29000); INSERT INTO "Cars" VALUES(5,'Bentley',350000); INSERT INTO "Cars" VALUES(6,'Citroen',21000); INSERT INTO "Cars" VALUES(7,'Hummer',41400); INSERT INTO "Cars" VALUES(8,'Volkswagen',21600); COMMIT;
.dump
命令向我们显示了创建 Cars
表所需的 SQL。
sqlite> .output cars2.sql sqlite> .dump Cars
我们也可以将输出重定向到文件。 .output
命令会将输出重定向到 cars2.sql
文件。
$ cat cars2.sql PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; CREATE TABLE Cars(Id INTEGER PRIMARY KEY, Name TEXT, Price INTEGER); INSERT INTO "Cars" VALUES(1,'Audi',52642); ...
我们使用 cat
命令显示 cars2.sql
文件的内容。
读取 SQL
我们可以使用 .read
命令从文件名中读取 SQL 语句。
sqlite> .tables Authors Cars Friends Reservations Books Customers Orders sqlite> DROP TABLE Cars; sqlite> .tables Authors Customers Orders Books Friends Reservations sqlite> .read cars.sql sqlite> .tables Authors Cars Friends Reservations Books Customers Orders sqlite> SELECT * FROM Cars WHERE Id=1; Id Name Price ---------- ---------- ---------- 1 Audi 52642
在这里,我们执行了一系列命令。我们删除该表并从 cars.sql
中读取它。
.sqlite_history 文件
命令和语句被存档在 .sqlite_history
文件中。该文件位于主目录中。
$ tail -5 ~/.sqlite_history .tables SELECT * FROM Cars; .mode column .headers on .show
使用 tail
命令,我们显示最后五个条目。
资源文件
sqlite3
工具有一个名为 .sqliterc
的资源文件。它位于主目录中。如果没有这样的文件,我们可以简单地创建它。资源文件可以包含元命令或常规 SQL 语句。但是,我们应该避免在文件中使用 SQL。
$ cat .sqliterc .mode column .headers on .nullvalue NULL
这是一个资源文件的简单示例。它有三个元命令。使用资源文件,我们在启动 sqlite3
工具时不必再次执行元命令。它们将在工具启动时自动执行。
$ sqlite3 test.db -- Loading resources from /home/janbodnar/.sqliterc SQLite version 3.16.2 2017-01-06 16:32:41 Enter ".help" for usage hints.
我们有一条消息说,该工具在开始时加载了资源。
命令行选项
该工具有几个命令行选项。它们主要复制了元命令。请注意,命令行选项会覆盖资源文件元命令。
$ sqlite3 --help -- Loading resources from /home/janbodnar/.sqliterc Usage: sqlite3 [OPTIONS] FILENAME [SQL] FILENAME is the name of an SQLite database. A new database is created if the file does not previously exist. OPTIONS include: -ascii set output mode to 'ascii' -bail stop after hitting an error -batch force batch I/O -column set output mode to 'column' -cmd COMMAND run "COMMAND" before reading stdin -csv set output mode to 'csv' -echo print commands before execution -init FILENAME read/process named file -[no]header turn headers on or off -help show this message -html set output mode to HTML -interactive force interactive I/O -line set output mode to 'line' -list set output mode to 'list' -lookaside SIZE N use N entries of SZ bytes for lookaside memory -mmap N default mmap size set to N -newline SEP set output row separator. Default: '\n' -nullvalue TEXT set text string for NULL values. Default '' -pagecache SIZE N use N slots of SZ bytes each for page cache memory -scratch SIZE N use N slots of SZ bytes each for scratch memory -separator SEP set output column separator. Default: '|' -stats print memory stats before each finalize -version show SQLite version -vfs NAME use NAME as the default VFS
--help
选项为我们提供了所有可用选项的列表以及简要说明。
$ sqlite3 -echo -line -noheader test.db -- Loading resources from /home/janbodnar/.sqliterc SQLite version 3.16.2 2017-01-06 16:32:41 Enter ".help" for usage hints. sqlite> SELECT * FROM Cars LIMIT 2; SELECT * FROM Cars LIMIT 2; Id = 1 Name = Audi Price = 52642 Id = 2 Name = Mercedes Price = 57127
我们使用 -echo
、-line
和 -noheader
选项启动 sqlite3
工具。 SELECT
语句在启动后被重复/回显。输出采用行模式,并且我们没有显示标题。
$ sqlite3 -version -- Loading resources from /home/janbodnar/.sqliterc 3.16.2 2017-01-06 16:32:41 a65a62893ca8319e89e48b8a38cf8a59c69a8209
使用 -version
选项,我们可以获得 sqlite3 的版本。
$ sqlite3 -html test.db -- Loading resources from /home/janbodnar/.sqliterc SQLite version 3.16.2 2017-01-06 16:32:41 Enter ".help" for usage hints. sqlite> SELECT * FROM Cars LIMIT 2; <TR><TH>Id</TH> <TH>Name</TH> <TH>Price</TH> </TR> <TR><TD>1</TD> <TD>Audi</TD> <TD>52642</TD> </TR> <TR><TD>2</TD> <TD>Mercedes</TD> <TD>57127</TD> </TR>
使用 -html
选项,我们可以将结果输出为简单的 HTML 表。
在本 SQLite 教程中,我们使用了 sqlite3
命令行工具。我们描述了各种元命令,展示了如何转储表,以及从文件中读取 SQL。我们提到了 sqlite 的历史和资源文件。