sqlite-utils 4.1

Simon Willison's Blog 工具

摘要

sqlite-utils 4.1 引入了小型功能,包括用于 Python 代码块的 --code、用于列类型覆盖的 --type 以及严格模式支持,继续作为 SQLite CLI 工具发展。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/07/12 10:51

# 发布:sqlite-utils 4.1 来源:https://simonwillison.net/2026/Jul/11/sqlite-utils/ 自几周前(https://simonwillison.net/2026/Jul/7/sqlite-utils-4/)的 4.0 版本以来的第一个小版本更新,引入了一些次要的新功能。 > - `sqlite-utils insert` 和 `sqlite-utils upsert` 现在接受一个 `--code` 选项,用于提供一段 Python 代码块(https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-code)(或一个 `.py` 文件的路径),该代码定义了一个 `rows()` 函数或 `rows` 可迭代对象以插入行,作为从文件导入的替代方案。(#684 (https://github.com/simonw/sqlite-utils/issues/684)) `sqlite-utils` 已有允许将 Python 代码块作为 CLI 参数传递的功能,例如这个用于 `sqlite-utils convert` 命令(https://sqlite-utils.datasette.io/en/stable/cli.html#converting-data-in-columns)的功能: `` sqlite-utils convert content.db articles headline ' def convert(value): return value.upper()' `` 允许代码块直接生成新行(https://sqlite-utils.datasette.io/en/stable/cli.html#inserting-rows-generated-by-python-code)是该模式的明显扩展: `` 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` 来覆盖创建表时自动选择的类型(https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-csv-tsv-column-types)。这对于像邮政编码这样看起来像整数但应存储为 `TEXT` 以保留前导零的 CSV 或 TSV 列很有用。(#131 (https://github.com/simonw/sqlite-utils/issues/131)) 一个长期的功能请求,结果实现起来却很简单(https://github.com/SAY-5/sqlite-utils/commit/d2ac3765ed9f0516bb0cbc2508a5c3907fb6a71a)。 > - 新增 `table.drop_index(name)` 方法和 `sqlite-utils drop-index` 命令,用于按名称删除索引。两者都支持 `ignore=True`/`--ignore` 来忽略不存在的索引。(#626 (https://github.com/simonw/sqlite-utils/issues/626)) > - `sqlite-utils query` 现在可以通过传递 `-` 来代替查询字符串,从而从标准输入读取 SQL 查询,例如 `echo "select * from dogs" | sqlite-utils query dogs.db -`。(#765 (https://github.com/simonw/sqlite-utils/issues/765)) 两个更小的功能。我让 Codex 审查了所有未解决问题并突出显示了最简单的部分! > - `sqlite-utils upsert` 现在可以推断现有表的主键,因此在向已有主键的表进行 upsert 操作时可以省略 `--pk`。 另一个 Codex 的建议,这是 4.0 版本中 Python 库改进的一个明显的缺失 CLI 功能。 > - `table.transform()` 和 `table.transform_sql()` 现在接受 `strict=True` 或 `strict=False` 来更改表的 SQLite 严格模式(https://www.sqlite.org/stricttables.html)。省略该选项则保留现有模式。(#787 (https://github.com/simonw/sqlite-utils/issues/787)) > - `sqlite-utils transform` 命令现在接受 `--strict` 和 `--no-strict` 来更改表的严格模式。(#787 (https://github.com/simonw/sqlite-utils/issues/787)) 这两项功能受到 Evan Hahn 的《在 SQLite 中优先使用严格表》(https://evanhahn.com/prefer-strict-tables-in-sqlite/)的启发,该文章今天在 Hacker News(https://news.ycombinator.com/item?id=48873940)上广为流传。Evan 指出: > 不幸的是,我认为没有方法可以 ALTER 表使其变为严格。我认为必须将数据从非严格表复制到严格表中。 这正是 `sqlite-utils transform` 机制(https://sqlite-utils.datasette.io/en/stable/python-api.html#transforming-a-table)所做的,所以我扩展了它,增加了将表从严格切换到非严格以及反之的能力。 以下是我用于实现这些新严格表功能的 GPT-5.6 Sol xhigh Codex 记录(https://gist.github.com/simonw/ab8256b81646ad967a601975e206de64)。我运行过的最有用的提示之一是: > `使用 uv run python -c 并手动练习新的 .transform(strict=) 选项,看看是否能找到任何边缘情况或 bug` 这实际上是告诉模型手动测试它的工作,而不是依赖已经编写的自动化测试。这发现了两个小问题,我们随后修复了。

相似文章

sqlite-utils 4.1.1

Simon Willison's Blog

sqlite-utils 4.1.1 修复了在转换带有外键的表时的一个 TransactionError 边界情况,并改进了 CLI 和 Python API 之间的文档交叉引用。

sqlite-utils 4.0

Simon Willison's Blog

sqlite-utils 4.0 已发布,这是一个用于操作 SQLite 数据库的 Python 库。

sqlite-utils 4.0rc1

Simon Willison's Blog

sqlite-utils 4.0rc1 是 Python CLI 工具的一个发布候选版本,该工具简化了 SQLite 数据库操作。

sqlite-utils 4.0rc3

Simon Willison's Blog

sqlite-utils 4.0rc3 是一个候选发布版本,包含新功能,包括复合外键内省和不区分大小写的列匹配。