Simon Willison 原计划这个周末发布 sqlite-utils 4.0 正式版,结果先放出了 rc3。清理 rc2 之后的 issue 和 PR 时,他发现两处底层改动绕不过去:复合外键支持、列名大小写不敏感匹配。这两处都会碰到已有 API 的行为,稳定版发布前必须先处理干净,日期跟着往后挪。

这次延期不算意外,但也不是走过场。sqlite-utils 的候选版本本该只清 bug、锁定 API,rc3 却还在往里塞会改变返回结构的功能。对靠这个库做建表、迁移、外键检查的 Python 开发者来说,升级前最好先看一眼自己有没有直接读 table.foreign_keys 的返回值。

rc3 推迟了什么

Simon Willison 在 7 月 5 日发布了 rc3,这是 sqlite-utils 4.0 系列的第三个候选版本。

按原计划,4.0 stable 本该在这个周末上线。changelog 从 rc2 之后一路变厚,他自己也承认没料到要处理这么多东西。

推迟的原因不是 bug 修不完,是有两处改动涉及已有 API 的行为。这类改动必须赶在稳定版锁定前想清楚,不能留到正式版才改。

两处改动,一处伤筋动骨

改动内容对开发者的影响
复合外键支持新增对多字段组成的外键约束的识别和创建table.foreign_keys 返回结构变化,只认单字段外键的旧代码需要重新检查
列名大小写不敏感匹配跟随 SQLite 本身的大小写不敏感惯例建表、查询、索引匹配等多处调用路径要跟着调整

复合外键是 rc3 里分量最重的一条。sqlite-utils 过去只处理单字段外键,table.foreign_keys 的返回值也是照着这个假设写的。

现在要支持复合外键,返回的数据结构必然要变。Willison 在 release notes 里把这处改动标成了会影响现有代码的破坏性变更,这也是他必须在 rc 阶段先处理掉的原因,不能等 stable 发布后再补救。

大小写不敏感匹配听着是小事,SQLite 本身早就这么处理列名,sqlite-utils 现在补上这一课。代价是建表、查询、索引匹配好几处代码路径都要同步改,一般的 patch 版本不会做到这个深度。

谁该现在就检查代码

普通用户不用管这次延期,等 4.0 stable 出来直接升级就行,功能上不会缺什么。

真正需要在升级前检查代码的,是用 sqlite-utils 做自动建表、迁移脚本或外键校验的开发者。如果代码里直接读取 table.foreign_keys 的返回值,或者依赖列名大小写的严格匹配,升级到 4.0 前最好先跑一遍测试,确认没有把单字段外键或大小写敏感当成默认假设写死。

Willison 处理这批 issue 和 PR 时用了 Claude 和 GPT 系列模型辅助梳理,这是他个人工作流程的一部分,跟 sqlite-utils 本身的功能变化没有直接关系。

接下来该盯的,是 4.0 stable 什么时候真正落地,以及 release notes 会不会补上针对 table.foreign_keys 的迁移说明。