命令行工具是什么
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。两种方式都会按顺序对打开的数据库执行文件中的语句。