返回 2026-07-13
🛠 工具 / 开源

sqlite-utils 4.1 发布sqlite-utils 4.1

simonwillison.net·2026-07-11

sqlite-utils 发布了 4.0 版本后的首个小版本更新 4.1,引入了多项次要新功能。其中,`sqlite-utils insert` 和 `sqlite-utils upsert` 命令现在支持 `--code` 选项,允许在插入或更新数据时执行 Python 代码进行转换。该版本进一步完善了命令行工具的数据处理能力,为开发者提供了更灵活的数据库操作方式。

Simon Willison

这是几天前发布 4.0 版本以来的第一个小版本更新,引入了一些次要的新功能。

sqlite-utils insert 和 sqlite-utils upsert 现在接受 --code 选项,用于提供一段 Python 代码(或 .py 文件路径),该代码定义了要插入的 rows() 函数或 rows 可迭代对象,作为从文件导入的替代方案。(#684)

sqlite-utils 已经具备允许将 Python 代码块作为 CLI 参数传递的功能,例如 sqlite-utils convert 命令的这个功能:

sqlite-utils convert content.db articles headline '
def convert(value):
    return value.upper()'

允许代码块直接生成新行是该模式的一个明显扩展:

sqlite-utils insert data.db creatures --code '
def rows():
    yield {"id": 1, "name": "Cleo"}
    yield {"id": 2, "name": "Suna"}
' --pk id
sqlite-utils insert 和 sqlite-utils upsert 现在接受 --type column-name type 参数,以覆盖创建表时自动选择的类型。这对于 CSV 或 TSV 列(例如邮政编码)非常有用,它们看起来像整数,但应存储为 TEXT 以保留前导零。(#131)

这是一个长期以来的功能请求,结果证明实现起来非常简单。

新增 table.drop_index(name) 方法和 sqlite-utils drop-index 命令,用于按名称删除索引。两者都接受 ignore=True/--ignore 以忽略缺失的索引。(#626) sqlite-utils query 现在可以通过传递 - 代替查询语句来从标准输入读取 SQL 查询,例如 echo "select * from dogs" | sqlite-utils query dogs.db -。(#765)

还有两个小功能。我让 Codex 审查了所有未解决的问题,并突出了最容易解决的问题!

sqlite-utils upsert 现在可以推断现有表的主键,因此在向已有主键的表进行 upsert 操作时可以省略 --pk。

这是 Codex 的另一个建议,是 4.0 版本中发布的 Python 库改进中明显缺失的一个 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 指出:

遗憾的是,我认为没有办法通过 ALTER 将表变为严格模式。我认为你必须将数据从非严格表复制到严格表中。

这正是 sqlite-utils transform 机制所做的事情,因此我对其进行了扩展,增加了在严格表和非严格表之间切换的功能。

这是我用来实现这些新严格表功能的 GPT-5.6 Sol xhigh Codex 记录。我运行过的最有用的提示词之一是这个:

使用 uv run python -c 手动测试新的 .transform(strict=) 选项,看看能否发现任何边缘情况或错误

这实际上是让模型在它已经编写的自动化测试之外,手动测试其工作。这发现了两个小问题,随后我们进行了修复。

需要完整排版与评论请前往来源站点阅读。