Menu

SQLite 命令行教程:sqlite3 命令行工具用法

如何使用 sqlite3 命令行工具:打开数据库、运行查询、点命令,以及不离开终端就能导入或导出数据。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

命令行工具是什么

sqlite3 是 SQLite 自带的官方命令行工具。它打开一个数据库文件,给你一个提示符,让你对它运行 SQL。没有服务器,不用登录,不用配置:只有一个可执行文件和一个数据库文件。

你会用它快速查看数据、执行一次性查询、导出表结构和导入数据。不写应用代码就能摆弄数据库,这是最快的方式。

$ sqlite3 mydata.db
SQLite version 3.45.0
Enter ".help" for usage hints.
sqlite>

如果 mydata.db 还不存在,SQLite 会在你做第一次修改时创建它。不带文件名运行 sqlite3,会打开一个用完即弃的内存数据库。

在提示符下运行 SQL

进入命令行后,输入 SQL,每条语句都以分号结尾。命令行会等待这个分号:如果你没写分号就按了回车,它只会显示一个续行提示符。

分号的意思是“我写完了,运行吧”。忘了写,命令行就会停在 ...> 提示符那里等着。在新的一行输入 ; 就能结束。

点命令不是 SQL

凡是以 . 开头的都是点命令:这是给命令行工具本身的指令,而不是给 SQL 引擎的。它们不需要分号,也只能在 sqlite3 命令行中使用。

sqlite> .tables
books

sqlite> .schema books
CREATE TABLE books (
  id INTEGER PRIMARY KEY,
  title TEXT NOT NULL,
  year INTEGER
);

sqlite> .help

你会经常用到的几个:

  • .tables:列出当前数据库中的所有表。
  • .schema [table]:显示某一张表或所有表的 CREATE TABLE 语句。
  • .databases:列出已附加的数据库文件。
  • .mode <format>:更改查询结果的显示方式。
  • .headers on:在查询结果上方显示列名。
  • .read file.sql:执行一个 SQL 文件。
  • .exit 或 .quit:退出命令行。

.help 会打印完整的列表。点命令有几十个,但你常用的大概也就十个。

让输出更好读

默认的输出用竖线分隔,而且没有表头:用在脚本里没问题,读起来却很难看。两个点命令就能解决:

sqlite> .headers on
sqlite> .mode column
sqlite> SELECT * FROM books;
id  title        year
--  -----------  ----
1   Dune         1965
2   Neuromancer  1984

其他有用的模式:

  • .mode box:用 Unicode 边框画出表格,适合截图。
  • .mode csv:逗号分隔,适合通过管道传给其他工具。
  • .mode json:JSON 输出,每行一个对象。
  • .mode line:每列占一行,行很宽时很方便。

每次启动命令行,这些设置都会重置。想让它们永久生效,就把它们写进 ~/.sqliterc 文件,sqlite3 会在启动时加载它。

导入和导出 CSV

命令行工具内置了 CSV 支持。切换到 CSV 模式,然后用 .import 把文件导入一张表:

sqlite> .mode csv
sqlite> .import authors.csv authors
sqlite> SELECT * FROM authors LIMIT 3;

如果表不存在,.import 会创建一张,并把第一行用作列名。如果表已经存在,第一行会被当作数据,除非你传入 --skip 1。

反过来,把输出重定向到文件:

sqlite> .headers on
sqlite> .mode csv
sqlite> .output books.csv
sqlite> SELECT * FROM books;
sqlite> .output stdout

.output filename 会把之后每条查询的结果都写到这个文件中,直到你用 .output stdout 切换回来。不管是导出 CSV、JSON 还是原始的表结构,用的都是同一个机制。

运行 SQL 文件

超过几条语句的内容,就把 SQL 放进文件里再运行。在命令行中:

sqlite> .read setup.sql

或者在普通终端里运行,完全不用进入命令行:

$ sqlite3 mydata.db < setup.sql
$ sqlite3 mydata.db "SELECT count(*) FROM books;"

第二种写法只运行一条查询就退出,非常适合 shell 脚本或快速检查。如果需要格式化的输出,可以通过 -cmd 参数把它和 .mode 设置结合起来:

$ sqlite3 -header -column mydata.db "SELECT * FROM books;"

查看一个陌生的数据库

当有人给你一个 .db 文件,而你完全不知道里面有什么时,按这个套路来:

$ sqlite3 mystery.db
sqlite> .tables
sqlite> .schema
sqlite> .indexes
sqlite> SELECT count(*) FROM some_table;

不带参数的 .schema 会输出文件中所有的 CREATE TABLE、CREATE INDEX 和 CREATE TRIGGER。.indexes 按表列出索引。在命令行里花五分钟,了解到的数据库信息通常比任何 README 都多。

想要一份能在别处重建的完整文本快照,就用 .dump:

sqlite> .output backup.sql
sqlite> .dump
sqlite> .output stdout

它会写出一个 SQL 脚本,再交给 sqlite3 执行时,能完整重建这个数据库,包括表结构和数据。

退出命令行

有三种退出方式,效果完全相同:

sqlite> .exit
sqlite> .quit

或者在 macOS 和 Linux 上按 Ctrl+D(Windows 上是 Ctrl+Z 再按回车)。你的修改已经保存了:除非你显式开启了事务,否则 SQLite 会在每条语句运行时自动提交。

下一步:SQLite 图形界面工具

命令行工具速度快,又能写脚本,但有时你想用鼠标点开表、给列排序、直观地编辑行。SQLite 有几款不错的图形界面工具,下一页就来介绍。

常见问题

如何用 SQLite 命令行打开数据库?

在终端中运行 sqlite3 mydata.db。如果文件不存在,SQLite 会在你创建第一张表时创建它。不带文件名运行 sqlite3,会打开一个临时的内存数据库,退出后就消失了。

如何退出 sqlite3 命令行?

输入 .exit 或 .quit 并按回车,两者效果相同。在大多数系统上,按 Ctrl+D(Windows 上是 Ctrl+Z 再按回车)也可以关闭命令行。

SQLite 中的点命令是什么?

点命令是命令行工具的内置命令,以 . 开头,比如 .tables、.schema、.mode 和 .import。它们不是 SQL,而是给命令行工具本身的指令,所以末尾不需要分号,也只能在 sqlite3 命令行中使用。

如何在 SQLite 命令行中运行 SQL 文件?

在命令行里用 .read filename.sql,或者在外部用管道输入:sqlite3 mydata.db < filename.sql。两种方式都会按顺序对打开的数据库执行文件中的语句。

Coddy 编程语言插图

和 Coddy 一起学编程

开始