.mode是sqlite3命令行工具中最重要的点命令之一,它决定了SELECT查询结果以什么样式呈现在终端或者输出文件里。默认情况下,sqlite3使用list模式,所有字段用竖线|分隔,一眼看去很难分清列的边界。掌握了.mode之后,你可以把输出切换成整齐的表格、标准的CSV,甚至是JSON和HTML格式,应对导数据、写脚本、做演示等各种场景。这篇文章会把常用模式逐个讲清楚,并给出实际操作示例。

.mode命令的基本用法和常用模式一览
.mode属于sqlite3的点命令(dot-command),只在命令行工具里有效,不属于SQL语法的一部分,因此不能在代码中通过SQL语句调用。它的基本形式有两种:一种是.mode 模式名,直接切换全局输出格式;另一种是.mode 模式名 参数,比如csv模式可以附带自定义分隔符。执行时不以分号结尾,这一点和SQL语句不同,新手常常在这里踩坑。
查看当前支持的所有模式,可以在sqlite3交互环境中输入.help mode,会列出全部可用选项。常用模式包括:ascii、box、csv、column、html、insert、json、line、list、markdown、quote、table、tcl。其中最常用的是csv、column、list、json和line这几种,下面这段命令演示了最基本的切换流程:
-- 启动sqlite3并打开数据库 sqlite3 test.db -- 查看当前模式 .mode -- 切换为column模式 .mode column -- 打开列名显示(配合column效果更好) .headers on -- 再次查询 SELECT id, name, price FROM products LIMIT 5;
需要注意的是,.headers on虽然不是.mode的一部分,但和输出格式关系密切。column、box、table这些模式默认会显示列名,而csv模式需要配合.headers on才会把列名作为第一行输出。两者搭配使用才能得到完整可用的导出结果。
csv模式:导出数据的标准选择
csv模式会把每个字段用逗号分隔,字符串字段自动加上双引号包裹,如果内容本身含有逗号或双引号,会按照CSV规范进行转义,处理成""的形式。这是把SQLite数据导出到Excel、WPS或者导入其他数据库时最常用的格式。来看一个完整例子:
sqlite3 test.db .mode csv .headers on .output products.csv SELECT id, name, price FROM products; .output stdout
上面这段命令做了四件事:先切换到csv模式,再打开表头,然后用.output把后续输出重定向到products.csv文件,执行查询后用.output stdout切回终端。生成的文件可以直接用表格软件打开。
如果默认的逗号不满足需求,比如数据中大量包含逗号,可以改用其他分隔符。一种办法是.mode csv加自定义分隔符(较新版本支持),另一种更通用的做法是使用list模式配合.separator命令:
.mode list .separator "|" SELECT id, name, price FROM products;
这样输出的每个字段之间会用竖线分隔。此外还有quote模式,它会把所有值都加上SQL单引号并用逗号分隔,适合生成可以直接粘贴进INSERT语句的数据片段。在Windows命令行下做CSV导出时,建议先执行.encoding UTF-8避免中文乱码,同时注意CSV文件加BOM头的问题,如果Excel打开中文乱码,可以在导出后手动处理,或者用.once配合管道解决。
column模式与表格类模式:让终端输出整齐易读
column模式会计算每列的最大宽度并自动对齐,配合.headers on后效果类似一个小型表格,非常适合在终端做交互查询和演示。它的缺点是遇到超长字段会截断显示,可以通过.width命令手动指定每列宽度,例如.width 5 20 10分别设置前三列的宽度为5、20、10个字符。
.mode column .headers on .width 4 24 10 SELECT id, name, price FROM products LIMIT 5;
除了column,新版sqlite3还提供了box、table、markdown三种增强表格模式,它们自带边框或Markdown管道符语法,输出的表格自带完整边框线,不需要手动调宽度也非常美观。其中markdown模式生成的结果可以直接粘贴到README文档里使用,非常方便:
.mode markdown SELECT id, name, price FROM products LIMIT 3;
执行后输出大致类似:
| id | name | price | |---:|--------------------|------:| | 1 | 机械键盘 | 299.0 | | 2 | 无线鼠标 | 89.5 |
line模式则是另一种风格的易读格式,它把每一行记录竖着展示,每个字段名和值各占一行,记录之间用空行分隔。当表的字段很多、横向展示放不下时,line模式的可读性远高于column模式,排查单条数据的字段值特别顺手。
json、insert、html等编程向模式的实战用法
json模式会把查询结果输出为标准的JSON数组,字段名作为键,值按类型自动转换,数字不加引号,字符串加双引号,NULL输出为null。这个模式在写脚本时特别有用,比如配合shell脚本把SQLite数据转换成JSON后传给其他程序处理:
.mode json SELECT id, name, price FROM products WHERE price > 100;
输出形如:
[{"id":1,"name":"机械键盘","price":299.0},
{"id":3,"name":"4K显示器","price":1899.0}]
insert模式会把每行结果生成一条完整的INSERT语句,表名可以在参数中指定,例如.mode insert mytable会把结果包装成INSERT INTO mytable VALUES(...);的形式。这是在不同数据库之间搬移数据、或者生成测试数据脚本的好办法,导出的SQL文件可以直接在另一个SQLite库中执行。html模式则输出表格形式的HTML片段,包含tr、td等标签,适合快速生成网页展示用的数据表格,不过一般不建议在生产环境直接使用,更多是临时调试用途。
批量执行与非交互场景的格式控制技巧
在写自动化脚本时,往往不进入交互环境,而是直接在命令行用-cmd参数或者管道方式执行点命令。比如一次性导出CSV可以这样写:
sqlite3 test.db ".mode csv" ".headers on" "SELECT * FROM products;" > products.csv
这种写法把多个参数依次传给sqlite3,前面两条是点命令,最后一条是SQL语句,输出通过重定向写入文件。也可以用-cmd把格式设置放在前面:
sqlite3 -cmd ".mode box" -cmd ".headers on" test.db "SELECT * FROM users LIMIT 10;"
如果希望每次启动sqlite3都自动使用喜欢的格式,可以在用户主目录下创建.sqliterc文件(Windows下是C:\Users\用户名\.sqliterc),写入常用配置,sqlite3启动时会自动执行里面的点命令:
.mode column .headers on .nullvalue NULL
其中.nullvalue用于指定空值的显示文字,配合column模式可以清楚地区分空字符串和NULL。另外提一下tcl模式,它输出Tcl风格的引号包裹列表,普通开发中很少用到,了解即可。选择格式的原则很简单:给人看的选column、box或table,给程序处理的选csv、json或list,做数据迁移选insert,掌握这条主线,.mode的十几种模式就都能灵活驾驭了。