sqlite-utils 4.1 发布:新增代码生成导入与严格表转换

Simon Willison14 天前

sqlite-utils 4.1 是 4.0 发布数日后的首个小版本更新,主要带来一组面向命令行和 Python API 的小功能改进。

通过 Python 代码生成插入数据

sqlite-utils insertsqlite-utils upsert 现在支持 --code 选项。用户可以直接提供一段 Python 代码,或提供一个 .py 文件路径,用来定义:

  • rows() 函数;或
  • 名为 rows 的可迭代对象。

这些行数据可直接用于插入,作为从文件导入数据之外的另一种方式。

此前,sqlite-utils 已支持在命令行参数中传入 Python 代码,例如使用 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 insertsqlite-utils upsert 现在支持:

--type column-name type

该选项可覆盖创建表时自动推断出的列类型。

这对 CSV 或 TSV 数据很有用。例如 ZIP code 看起来像整数,但如果要保留前导零,就应存储为 TEXT,而不是整数类型。

新增删除索引功能

Python API 新增:

table.drop_index(name)

命令行也新增:

sqlite-utils drop-index

二者都支持忽略不存在索引的选项:

  • Python API:ignore=True
  • 命令行:--ignore

query 命令支持从标准输入读取 SQL

sqlite-utils query 现在可以用 - 代替查询语句,从标准输入读取 SQL。例如:

echo "select * from dogs" | sqlite-utils query dogs.db -

upsert 可自动推断已有主键

sqlite-utils upsert 现在可以在目标表已存在主键时自动推断主键,因此在这种情况下可以省略 --pk

这一能力补齐了 4.0 中 Python 库层面已有改进在命令行中的缺口。

支持切换 SQLite 严格表模式

Python API 中:

table.transform()
table.transform_sql()

现在支持:

strict=True
strict=False

用于切换表的 SQLite strict mode。若省略该选项,则保留现有模式。

命令行中,sqlite-utils transform 新增:

--strict
--no-strict

用于将表切换为严格模式或非严格模式。

SQLite 本身不能直接通过 ALTER TABLE 将已有表切换为严格表。通常需要将数据复制到新表中。sqlite-utils 的 transform 机制本来就会执行类似的表转换流程,因此这次扩展后可用于在严格模式和非严格模式之间切换。

AI 辅助开发中的测试提示

此次部分小功能来自让 Codex 检查开放 issue 并找出容易实现的项目。

在实现严格表相关功能时,作者还让模型在自动化测试之外进行手动测试,其中一个提示是:

use uv run python -c and manually exercise the new .transform(strict=) option, see if you can find any edge-cases or bugs

这一做法帮助发现并修复了两个小问题。

评论

请登录后发表观点

暂无数据