趁着最近空下来,我把 SQLite3 数据库从头到尾又认真复习了一遍。这个年纪再回头去看这些基础内容,和当年在学校做课程设计时的感觉完全不一样——以前只是照着教程敲命令,这次一边敲一边把文件存储结构、事务提交、锁机制、Python 怎么配合都顺了一遍,顺手整理成了这篇文章。如果你也正在准备数据库课设、马上要面试,或者手头要写一个带本地存储的小工具,这篇应该能帮你在最短时间内把 SQLite3 复习到可以直接上手的程度。
这篇文章不适合零基础从头学数据库的人看,更适合已经接触过 SQL、但想系统梳理一遍 SQLite3 常用操作细节的人。我会先讲清楚 SQLite3 的定位和边界,再重点过命令行基础和 Python 操作,最后把内存数据库、事务、锁这些容易忽略的内容串起来,顺带附上我这次复习踩过的坑和排查记录。
1. 复习前先把 SQLite3 的运行逻辑和使用边界理清楚
1.1 嵌入式数据库到底意味着什么
很多教材上来就让你建表、插入、查询,结果学完 SQLite3 的人还是会困惑:为什么别人连 MySQL 要先启动服务、设置账号密码,我这里只需要一个 .db 文件就能跑?
这里面的核心差异在于,SQLite3 是一个嵌入式关系型数据库。它不是一个独立运行的服务器进程,而是一个 C 语言库,被直接链接到你的应用程序里。你的应用进程调用它的接口,它在同一个进程里直接读写磁盘上的数据库文件。整个数据库就是单个普通文件,这个文件可以拷贝、压缩、用 U 盘带走,没有端口号、没有配置文件、没有单独的数据库实例概念。
我给你们打个比方,MySQL 这类服务端数据库像一家独立的银行网点,你要存款取款,先排队、报账号、通过验证,银行后台系统处理完再给你回执。SQLite3 更像你随身带的记账本,所有交易都是你自己翻开本子直接写,不需要经过任何第三方机构。所以 SQLite3 的核心优势就是零配置、免维护、启动快、文件即数据。
这个"文件即数据库"的特征还带来一个实用的想法:备份数据库等于复制文件。我以前做项目时,要导出 SQLite 数据给同事,直接压缩 .db 文件发过去,对方放进项目目录就能打开,连导入导出流程都省了。
1.2 什么是适合用的场景,什么情况千万别硬上
正是因为"嵌入式"这个属性,SQLite3 最适合处理本地数据、单机应用、移动端存储、嵌入式设备这类场景。比如桌面小工具的配置数据、手机 App 的离线缓存、物联网设备上的记录存储、数据分析过程中的中间结果,还有学校课程设计里那种并发量很低的信息管理系统,这些场景用 SQLite3 都非常舒服。
但如果你指望它扛住几十个用户同时频繁写入,甚至作为电商网站的核心存储,那就不合适了。SQLite3 的写入锁是数据库级的,也就是说任何一个时刻只能有一个连接成功写入,并发写多的时候会出现明显的锁等待。此外它也没有用户权限管理、主从复制、集群这些服务端数据库的能力,不适合多客户端通过局域网/外网大规模共享访问。
我自己记忆使用边界的方法是看两个指标:一是数据量级,单库别去玩 TB 级别;二是写入并发频率,如果需求里出现"多用户同时提交订单",
基本可以考虑换 PostgreSQL 或 MySQL。数据量几百万行以内、日活在几千以下、以单机应用为主,SQLite3 完全能胜任。
1.3 和 MySQL、PostgreSQL 快速对比
整理对比表是我这次复习的一个收尾动作。这里不罗列官网参数,只从实际选型角度做个对照:
| 对比项 | SQLite3 | MySQL | PostgreSQL |
|---|---|---|---|
| 架构 | 嵌入式库,零配置文件 | 独立服务,需启动和账号 | 独立服务,功能强大 |
| 数据库形态 | 单个 .db 文件 | 数据目录+系统表 | 数据目录+系统表 |
| 部署复杂度 | 极低,放个文件就行 | 较高,需安装配置 | 较高 |
| 并发写入 | 库级写锁,弱 | 行级锁,中等 | MVCC,较强 |
| 适用规模 | 小型项目、边缘设备 | 中大型 Web | 中大型复杂业务 |
| 备份方式 | 复制文件即可 | mysqldump 等工具 | pg_dump 等工具 |
这里提醒一下,不要因为这是个"轻量级数据库"就看不起它。SQLite 是全世界部署量最大的数据库,手机、浏览器、嵌入式设备里到处都是。你得选对工具做对的事,面试时能把这个取舍讲清楚,比背多少 SQL 语法都加分。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 命令行基础一轮过:从打开数据库到增删改查
2.1 环境和打开数据库的几种方式
复习命令行操作之前,先确保环境里有 sqlite3 执行文件。Linux 和 macOS 基本自带,Windows 下需要到 SQLite 官网下载预编译的二进制文件,把 sqlite3.exe 放进任意目录或加入 PATH。
打开数据库最常见的命令是:
bash复制sqlite3 school.db
注意如果这个文件不存在,SQLite3 会先创建一个空文件,再进入命令行交互模式。如果你只想先看看某个文件里有什么,先不带文件名启动,再用 .open 指定路径也可以:
bash复制sqlite3
.open school.db
进到交互模式后,第一件事永远是看表结构。下面这条命令会列出所有表:
bash复制.tables
想查看某张表的建表语句,用 .schema:
bash复制.schema students
我复习的时候发现很多人只会用 SELECT 查数据,忘记了还有一堆点命令。这些命令以点开头,是 SQLite 命令行客户端的特殊指令,不是 SQL 语句。常见的有:
- .databases:列出当前连接打开的数据库文件
- .tables:列出所有表
- .schema 表名:查看建表语句
- .headers on:开启结果集表头,默认关闭
- .mode column:以列对齐方式显示结果
- .nullvalue NULL:把 NULL 值显示为 NULL
- .quit 或 .exit:退出
强烈建议一开库就把前两行敲掉,否则查询结果挤成一团,完全没法看:
bash复制.headers on
.mode column
2.2 建表时的字段类型和主键细节
无论操作什么数据库,建表都是第一步。下面是学生成绩管理系统里常见的一张某课程表:
sql复制CREATE TABLE IF NOT EXISTS courses (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
credit REAL DEFAULT 2.0,
created_at TEXT DEFAULT (datetime('now', 'localtime'))
);
复习建表重点要理解两个概念。
第一,SQL
