sqlite-utils 4.1.1 发布:修复外键事务边界问题
Simon Willison2026-07-14 05:04
sqlite-utils 4.1.1 更新要点
sqlite-utils 4.1.1 是一次小版本修复,重点解决 table.transform() 在涉及外键和事务时的一个边界问题。
修复:避免外键级联操作导致意外数据变更
在以下条件同时满足时,table.transform() 现在会抛出 TransactionError:
- 当前已有事务处于打开状态;
- 启用了
PRAGMA foreign_keys; - 目标表被其他表通过外键引用;
- 外键使用了具有破坏性的
ON DELETE动作,包括:CASCADESET NULLSET DEFAULT
这一改动的原因是:SQLite 中 PRAGMA foreign_keys 不能在事务内部修改。此前,table.transform() 在转换过程中会删除旧表,如果外键启用且存在上述 ON DELETE 行为,删除旧表可能触发级联动作,从而静默删除或修改引用表中的行。
现在通过提前抛出异常,可以避免这类隐蔽的数据风险。
文档改进:CLI 与 Python API 互相引用
本次更新还改进了文档结构:
- CLI 文档中的相关章节会链接到等价的 Python API 功能;
- Python API 文档中的相关章节也会链接回对应的 CLI 命令。
这有助于用户在命令行用法和 Python 编程接口之间更快找到对应关系。
适合关注的人群
如果你在项目中使用 sqlite-utils 进行表结构转换,并且数据库中启用了外键约束,尤其是使用了 ON DELETE CASCADE、SET NULL 或 SET DEFAULT,建议关注这个版本的行为变化。