SQLite 这个东西,用起来没门槛,真正把它用好的却不多。我之前接手过一个工具项目,数据全堆在 JSON 文件里,改一个字段要在代码里查找替换半天。后来把存储层切到 SQLite,表数据管理这件事才彻底理顺。今天的分享就围绕 SQLite 的表数据管理展开,从插入、查询、更新、删除,到事务、约束、备份,再到 DB Browser for SQLite 的界面化操作,把命令行和图形界面里都能用得上的经验一次讲透。适合刚接触 SQLite 的人,也适合早就入了门但没系统梳理过的老手。
1. 表数据管理为什么值得单独说:SQLite的定位与准备工作
1.1 先搞明白SQLite是什么形态的数据库
SQLite 没有独立服务进程,不需要配置端口,没有用户名密码,数据库就是一个普通文件。这个特性让它非常适合桌面程序、移动端、嵌入式设备和工具脚本,但也带来一个惯性:很多人只把它当文件用,只关心读写接口,不关心数据是怎么组织的。等到数据量变大、字段开始互相依赖、误操作需要恢复的时候,才发现自己在表数据管理上的理解远远不够。
SQLite 的表数据管理和 MySQL、PostgreSQL 这类客户端-服务器数据库有几点明显差异。第一,锁粒度不同。SQLite 的写锁机制相对简单,写入并发能力弱,读写并发要靠 WAL 模式缓解。第二,类型机制宽松。SQLite 支持动态类型,一个列里可以存不同类型的数据,这在方便的同时也是隐患。第三,ALTER TABLE 的能力很弱,想改列名、改约束,往往要重建整张表。这些差异决定了你不能把服务端数据库的运维经验直接搬过来,必须单独总结一套适合 SQLite 的做法。
1.2 准备环境:命令行与图形化工具
实操之前先把工具准备好。命令行方案是使用 Python 自带的 sqlite3 模块,不需要额外安装;如果你更习惯用 sqlite3 命令行工具,macOS 和 Linux 通常自带,Windows 可以去官网下载。图形化工具首选 DB Browser for SQLite,免费开源,官网提供 Windows、macOS、Linux 版本,界面支持中文,安装后在菜单里就能切换语言。这个工具解决了一个很实际的问题:你想看表里到底有什么数据时,比在命令行里敲 SELECT 直观得多。
我建议日常组合使用:开发时用 DB Browser for SQLite 查看表结构、排查数据,写脚本批量处理时用 Python sqlite3 或命令行工具。接下来所有 SQL 示例,基本都能直接在 DB Browser for SQLite 的“执行 SQL”标签页里运行,也可以用 Python 执行。为了后面演示方便,先建一张商品表:
sql复制CREATE TABLE products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
category TEXT NOT NULL DEFAULT '未分类',
price REAL NOT NULL DEFAULT 0,
stock INTEGER NOT NULL DEFAULT 0,
created_at TEXT NOT NULL DEFAULT (datetime('now', 'localtime'))
);
这个表结构我特意设计了几个常见约束:id 用自增主键确保唯一标识,name 是 NOT NULL 防止脏数据,price 用 REAL 表示价格但要注意浮点精度,category 后面做分组查询时要用,stock 是库存,更新频率比较高。有了这张表,后面所有操作都有地方落地。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 插入数据的道与术:从单行INSERT到批量加速
2.1 基础INSERT与字段匹配
插入单行数据,标准写法是这样的:
sql复制INSERT INTO products (name, category, price, stock)
VALUES ('机械键盘', '外设', 399.00, 50);
这里不需要指定 id,自增主键会自动生成;created_at 有默认值,也不用显式写。有人会省略字段列表,直接写成 INSERT INTO products VALUES (...),这种写法要求 VALUES 里的值和表字段顺序完全一致,非常脆。表结构稍有调整,SQL 语句就会出错。所以我给自己定的规矩是:所有 INSERT 都显式列出字段名,看着多敲几个字,后面维护省很多事。
还需要特别注意 SQLite 的类型亲和性。虽然 price 定义成了 REAL,但你插入一个 'abc' 字符串,SQLite 大概率也会接受,因为它默认不会严格执行列类型。如果业务上必须保证数值类型正确,就得靠 CHECK 约束或者应用层校验,不能只依赖列定义。这一点在初学阶段很容易忽略,等数据里混进奇怪类型再回头处理就很被动了。
2.2 多条插入与批量提速
当有一批记录要插入时,最简单的方案是用多组 VALUES:
sql复制INSERT INTO products (name, category, price, stock) VALUES
('无线鼠标', '外设', 199.00, 100),
('显示器', '显示设备', 1299.00, 20
