使用 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 文档也会反向链接到等效的命令行操作,两者之间相互跳转更加便捷,查找效率显著提升。
