ZetCode

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 的历史和资源文件。