SQLite should have (Rust-style) editions
357 points • 1 day agoArticle Link

SQLite 被广泛认为是本地数据存储的行业标准:作为一个以库形式提供的关系型数据库引擎,它免去了自定义序列化器的需求。尽管它在从嵌入式项目到服务器软件中广泛使用,但引擎存在一个明显的问题——其默认配置对现代开发往往既不直观也不理想。这些源于历史的默认设置经常导致数据不一致、性能瓶颈和意外的运行时错误。

一个主要问题是外键约束默认被禁用。不强制执行外键会带来数据损坏的风险,特别是考虑到 SQLite 的 row-id 重用策略,悬空引用可能会意外指向无关数据。同样,SQLite 通过灵活的类型亲和性允许列存储与声明的模式不符的类型,这虽然增加了灵活性,但也常导致静默失败和难以发现的 bug 。虽然有 strict tables 可以缓解这一问题,但必须逐表启用,无法全局设置,给开发者增加了额外负担。

在并发和性能方面也存在不足:默认情况下并发写操作会立即返回 SQLITE_BUSY 错误而不是等待锁释放,且 Write-Ahead Log (WAL) 模式默认关闭,限制了性能。为达到现代数据库应有的功能和稳定性,开发者不得不反复手动配置各种 pragma(如 busy_timeout 和 journal_mode)。

拒绝改变这些默认值的主要原因是对向后兼容性的严格坚持——修改既有行为可能会破坏现有软件。但这种做法也把 SQLite 限制在过去,阻碍其随现代工程实践演进。为在不损害遗留系统完整性的前提下打破这一僵局,引入类似 Rust 的 edition 系统可作为一种折中方案。

设计一个"超级 pragma",例如 edition 标志,可以让开发者选择一套现代化、强化的默认设置。通过设置 edition,用户能够全局启用外键强制、严格类型、合理的写入超时以及像 WAL 这样的性能优化模式。基于版本的方法不仅能理清当前混乱的配置,还为未来改进提供可扩展的路径,使数据库在不抛弃旧项目的前提下不断进步。

171 comments • Comments Link

• 在 SQLite 中引入 "editions"(例如 `PRAGMA edition = 2026`)为采用更现代的默认设置提供了可行路径,同时保持严格的向后兼容,允许开发者在不破坏遗留项目的情况下选择更安全的配置。

• 业界对 SQLite 锁机制的诸多误解,多源于对其如何实现 ACID 要求的不清楚。和其他数据库一样,SQLite 通过有序队列来管理并发写入,而不是通过多个写入器并行处理。

• "edition" 提案旨在解决因过时或过于宽松的默认设置(例如与 `SQLITE_BUSY` 处理相关的设置)带来的摩擦,将现代的生产级配置封装为单一的可选声明。

• 批评者认为,这可能使版本兼容性变得复杂:旧版 SQLite 无法识别较新的 edition 标识,可能导致不同软件版本间数据库可用性的分歧。

• 一些开发者主张放弃 Postel's Law(即对输入保持宽容),通过强制更严格的数据类型和设置来提升 SQLite 的鲁棒性,使其更符合现代编程的期望。

• 许多人认为以系统级配置文件或类似 /etc 的方法来管理 SQLite 不合适,因为这可能干扰依赖标准遗留行为的现有且运行良好的应用。

• 使用 `AUTOINCREMENT` 可以防止 SQLite 重用主键,尽管默认的 ROWID 重用行为在开发者中存在争议,部分人将 ID 回收视为潜在的安全或数据完整性风险。

• 有人把这一做法与 Postfix 的 `compatibility_level` 参数做了比较:后者通过对弃用行为发出警告并要求开发者明确声明版本需求,成功管理了不断变化的默认设置。

• 这场辩论暴露了一个根本矛盾:一方把 SQLite 当作"即插即用"的文件容器,优先考虑简单性与对遗留系统的支持;另一方则把它视为应不断演进以提供更严格、"工业级"默认行为的强大引擎。

• 尽管很多人希望内置更强的功能,但也有人认为配置负担应留在应用层或包装库,以保持 SQLite 作为轻量、可嵌入工具的核心定位,而不是把它变成复杂的服务器型 RDBMS 。

这场讨论反映出 SQLite 作为一种稳定、极度可移植的数据格式角色,与开发者对更现代、更安全、更严格默认设置日益增长的需求之间的深层张力。虽然不少人认为"editions"为摆脱历史包袱提供了巧妙方案,但也有人担心它会带来不必要的复杂性和兼容性碎片化。归根结底,这次争论强调了一个事实:尽管常常被拿来与大型服务器系统比较,SQLite 最核心的价值仍在于作为一种可定制的、稳健的文件格式替代品,而那些追求"工业级"严格 SQL 行为的用户,往往会觉得其默认配置有所不足。