sqlite-utils 4.1
sqlite-utils 4.1
sqlite-utils 4.1 发布,在 4.0 基础上引入多项小功能改进。`sqlite-utils insert` 和 `upsert` 新增 `--code` 选项,支持通过 Python 代码定义 `rows()` 函数或可迭代对象生成新行;新增 `--type column-name type` 选项覆盖 CSV/TSV 列自动类型推断。新增 `table.drop_index(name)` 方法和 `drop-index` 命令,支持 `--ignore` 忽略不存在的索引。`sqlite-utils query` 支持从标准输入读取 SQL 查询。`upsert` 可推断现有表主键,`table.transform()` 和 `transform` 命令新增 `strict`/`--strict` 选项切换 SQLite strict 模式。上述功能受 Evan Hahn 文章启发,并由 Codex 辅助实现。
发布:sqlite-utils 4.1 这是继几天前 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 strict 模式。省略该选项则保留现有模式。(#787)sqlite-utils transform 命令现在支持 --strict 和 --no-strict 来更改表的 strict 模式。(#787)
这两项功能受 Evan Hahn 的《Prefer STRICT tables in SQLite》一文启发,该文今天在 Hacker News 上引起了讨论。Evan 指出:
不幸的是,我认为没有办法通过 ALTER 语句将表改为 strict 模式。我认为必须将数据从非 strict 表复制到 strict 表中。
这正是 sqlite-utils transform 机制所做的,因此我扩展了它,使其能够在 strict 和非 strict 模式之间切换表。
以下是我用于实现这些新 strict 表功能的 GPT-5.6 Sol xhigh Codex 记录。我运行的最有用的提示之一是:
use uv run python -c and manually exercise the new .transform(strict=) option, see if you can find any edge-cases or bugs
这实际上是让模型在已编写的自动化测试之外,手动测试其工作。这发现了两个小问题,随后我们进行了修复。
标签:projects, python, sqlite, sqlite-utils, annotated-release-notes, ai-assisted-programming