sqlite-utils 4.1 发布:新增代码生成导入与严格表转换
sqlite-utils 4.1 是 4.0 发布数日后的首个小版本更新,主要带来一组面向命令行和 Python API 的小功能改进。
通过 Python 代码生成插入数据
sqlite-utils insert 和 sqlite-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 insert 和 sqlite-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
这一做法帮助发现并修复了两个小问题。
