sqlite-utils 4.1.1发布:修复外键事务下可能误删数据
作者:技术拾光时间:2026-07-18 08:40:04浏览:304
sqlite-utils4.1.1修复table.transform()在事务中启用外键且被引用表含破坏性删除时,因SQLite限制导致数据静默删除的漏洞。新版本直接抛出TransactionError阻止操作,并改进文档双向导航。
sqlite-utils 4.1.1 发布:修复外键事务下的数据丢失风险
用 sqlite-utils 的朋友注意了,4.1.1 版本刚出来,修复了一个容易让人踩坑的边界问题——跟外键、事务、表结构转换搅在一起时,搞不好会静默丢数据。

问题具体表现
问题出在调用 table.transform() 的时候。如果当前事务还开着,PRAGMA foreign_keys 也启用了,而且你正在转换的表恰好被其他表通过外键引用,并且那个外键还设了 CASCADE、SET NULL 或 SET DEFAULT 这类带破坏性的删除动作——那就糟了。旧版本在重建表的过程中,删除旧表的动作会触发这些外键规则,导致引用行被悄无声息地删掉或改掉。
根本原因
根源在于 SQLite 的一个限制:事务内部不允许切换 PRAGMA foreign_keys。而 sqlite-utils 的表转换流程需要先删旧表再建新表,这一删,外键规则就炸了。
新版解决方案
从 4.1.1 开始,遇到这种组合条件,table.transform() 会直接抛出 TransactionError,坚决不让你继续。升级后如果碰到这个异常,先结束当前事务,再按照官方文档里关于外键和事务的处理方式去做结构变更。
其他改进
另外新版本还顺手改进了文档导航:命令行文档现在会链到对应的 Python API,Python API 文档也会反向链到等效的命令行操作,两边互相找起来方便多了。
