sqlite-utils 4.1 发布:支持内联 Python 代码与严格表模式切换
发布版本:sqlite-utils 4.1
自几日前的 4.0 版本以来,这是首次发布的点状版本,此次更新引入了多项细微的新功能。
• sqlite-utils 的 insert 和 upsert 功能现已支持通过 --code 选项,以在 提供一段 Python 代码(或一个 .py 文件路径)的方式,来定义一个 rows() 函数,或者将要插入的行的可迭代对象,以此替代从文件中导入数据。 (#684)
sqlite-utils 早已具备一些功能,允许您将 Python 代码块作为 CLI 参数传递,例如在 sqlite-utils 的 convert 命令中,就采用了这样的方式:
允许代码块直接生成新行——这一功能正是对这一模式的直观延伸:
• sqlite-utils 的 insert 和 upsert 功能现已支持通过 --type 列名 类型参数,以在表创建时自动选择的类型上进行覆盖。 这在处理 CSV 或 TSV 格式的列时尤其有用,例如那些看似为整数但实际应以 TEXT 类型存储、以保留前导零的 ZIP 码列。(#131)
这项功能长期以来一直备受用户期待,而最终却得到了一项 简单易用的实现方案。
• 新增了 table.drop_index(name) 方法,以及用于按名称删除索引的 sqlite-utils drop-index 命令。两者均支持 ignore=True/--ignore 选项,以忽略缺失的索引。
(#626)
• sqlite-utils 的查询功能现已支持从标准输入读取 SQL 查询,只需通过 - 参数代替查询语句即可,例如:echo "select * from dogs" | sqlite-utils query dogs.db。
(#765)
此外还有两项小功能。我已对所有开放问题进行了 Codex 审核,并重点标注了最简单的几个!
• sqlite-utils 的 upsert 功能现在可以自动推断现有表的主键,因此在向已拥有主键的表执行 upsert 操作时,可省略 --pk 参数。
另一项 Codex 提议,也是 Python 库在 4.0 版本中推出的一项改进所遗漏的显而易见的 CLI 功能。
• table.transform() 和 table.transform_sql() 现在支持 strict=True 或 strict=False 选项,以调整表的 SQLite 严格模式。若省略该选项,则会保留现有的模式。 (#787)
• sqlite-utils 的 transform 命令现支持 --strict 和 --no-strict 选项,以切换表的严格模式。(#787)
这两项功能的灵感源自 Evan Hahn 的文章《Prefer STRICT tables in SQLite》,该文在今日的 Hacker News 上引发了广泛讨论。(Evan 指出:)
遗憾的是,我认为目前并没有办法对表进行修改,使其变为严格模式。我认为,你必须先将非严格模式的表中的数据复制到严格模式的表中。
而 sqlite-utils 的 transform 机制正是实现了这一功能,因此我对其进行了扩展,新增了将表从严格模式切换至非严格模式,以及反之的能力。
以下是我在实现这些新的严格表功能时所使用的 GPT-5.6 Sol xhigh Codex 脚本。我曾使用其中一条最实用的提示:
运行 uv run python -c,并手动测试新的 .transform(strict=) 选项,看看是否能发现任何边缘情况或 bug。
实际上,这相当于让模型在已经编写好的自动化测试之外,主动进行手动测试,以验证其功能。随后我们发现了两个小问题,并及时予以修复。