sqlite-utils 4.0rc1 adds migrations and nested transactions
TL;DR · AI 摘要
sqlite-utils 4.0rc1 新增了数据库迁移和嵌套事务功能,提升 SQLite 数据库管理的灵活性和可靠性。
核心要点
- sqlite-utils 4.0rc1 引入了数据库迁移功能,支持通过 Python 或 CLI 工具执行迁移。
- 迁移系统不支持回滚,建议通过新迁移覆盖错误。
- 新增的 db.atomic() 支持嵌套事务,借鉴自 Django 和 Peewee 的术语。
结构提纲
按章节快速跳转。
- §引言
介绍 sqlite-utils 4.0rc1 的主要新特性:数据库迁移和嵌套事务。
迁移功能基于 sqlite-migrate 包,支持通过 Python 或 CLI 工具执行迁移脚本。
- ·迁移示例
提供一个 migrations.py 文件的示例,展示如何定义和执行迁移。
- ·迁移限制
迁移系统不支持回滚,建议通过新迁移覆盖错误。
提供一个使用 db.atomic() 的代码示例,展示如何处理嵌套事务。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- sqlite-utils 4.0rc1 新特性
- 数据库迁移
- 基于 sqlite-migrate
- 支持 Python 和 CLI 工具
- 不支持回滚
- 嵌套事务
- db.atomic() API
- 支持 savepoints
- 借鉴 Django 和 Peewee
金句 / Highlights
值得收藏与分享的关键句。
迁移系统不提供 reverse migrations,所以任何错误都应通过部署新的迁移来修复。
SQLite 支持 savepoints 形式的嵌套事务,新 API 使这些操作更容易使用。
迁移功能是基于 sqlite-migrate 包的修改版,已被多个项目验证稳定。
sqlite-utils 4.0rc1 添加了迁移和嵌套事务
Simon Willison 的博客
订阅
#smallhead
由以下公司赞助:
微软 —— 代理项目在演示和生产之间停滞。微软的 MVP 检查清单填补了这一差距。
尝试使用
sqlite-utils 4.0rc1 添加了迁移和嵌套事务
2026 年 6 月 21 日
sqlite-utils 是我用于处理 SQLite 数据库的 Python 库和 CLI 工具。它在 Python 默认的 sqlite3 包之上提供了大量高级操作,包括对复杂表转换的支持、从 JSON 数据自动创建表以及许多其他功能。
我发布了 sqlite-utils 4.0rc1,这是 sqlite-utils v4 的第一个发布候选版本。主要版本的升级表明有一些(较小的)向后不兼容的更改,因此我有兴趣在发布稳定版本之前让一些人尝试这个版本。
#### 新功能:迁移
与之前的 4.0 alpha 版本相比,这个 RC 版本有两个显著的新功能。
第一个是支持数据库迁移。这不是一个全新的实现,而是几年前我发布的 sqlite-migrate 包的一个略微修改的移植版本。我认为这个包在时间的考验中已经证明了自己的价值,所以我现在准备将其直接打包到 sqlite-utils 中。
这是一个 migrations.py 文件中迁移集的示例:
from
sqlite_utils
import
Database
,
Migrations
migrations
=
Migrations
(
"creatures"
)
@
migrations
()
def
create_table
(
db
):
db
[
"creatures"
].
create
(
{
"id"
:
int
,
"name"
:
str
,
"species"
:
str
},
pk
=
"id"
,
)
@
migrations
()
def
add_weight
(
db
):
db
[
"creatures"
].
add_column
(
"weight"
,
float
)这定义了一组两个迁移,一个用于创建 creatures 表,另一个用于向该表添加一个列。
然后可以使用 Python 运行这些迁移:
db
=
Database
(
"creatures.db"
)
migrations
.
apply
(
db
)或者使用命令行 migrate 命令:
sqlite-utils migrate creatures.db migrations.py这个系统设计得非常小巧:它不提供反向迁移,因此您所犯的任何错误都应通过部署一个新的迁移来修复。
它的前身已经被 LLM 和其他各种项目使用了数年,因此我对该设计的稳定性以及其良好的工作方式充满信心。
新的迁移功能在这里有详细文档。
#### 新功能:db.atomic() 事务
与迁移相比,这个功能的使用较少,因此需要测试人员更多的关注。
之前,sqlite-utils 主要将事务管理交给用户,通过 with db.conn: 构造直接重用 sqlite3 机制。
SQLite 支持以保存点形式的嵌套事务,因此我希望有一个抽象,可以尽可能地使这些操作变得容易使用。
我从 Django 和 Peewee 借用了“atomic”这一术语。这是新 API 的示例:
with
db
.
atomic
():
db
.
table
(
"dogs"
).
insert
({
"id"
:
1
,
"name"
:
"Cleo"
},
pk
=
"id"
)
try
:
with
db
.
atomic
():
db
.
table
(
"dogs"
).
insert
({
"id"
:
2
,
"name"
:
"Pancakes"
})
raise
ValueError
(
"skip this one"
)
except
ValueError
:
pass
db
.
table
(
"dogs"
).
insert
({
"id"
:
3
,
"name"
:
"Marnie"
})更多详情请参见文档。
#### 向后不兼容的更改
v4 的向后不兼容更改在 alpha 版本说明中进行了描述。对于 4.0a0:
现在,所有 SQLite 3.23.1 之后的版本都使用 SQLite 的 INSERT ... ON CONFLICT SET 语法进行 Upsert 操作。这对于依赖于先前 INSERT OR IGNORE 后跟 UPDATE 行为的应用程序来说,是一个非常轻微的破坏性变更。(#652)Python 库用户可以通过向 Database() 构造函数传递 use_old_upsert=True 来选择使用先前的实现方式,详情请参见使用 INSERT OR IGNORE 的替代 Upsert 方法。已停止对 Python 3.8 的支持,新增对 Python 3.13 的支持。(#646)sqlite-utils tui 现在由 sqlite-utils-tui 插件提供。(#648)测试套件现在也针对 SQLite 3.23.1 运行,这是在新增的 INSERT ... ON CONFLICT SET 语法添加之前的最后一个版本(发布于 2018-04-10)。(#654)
对于 4.0a1:
破坏性变更:db.table(table_name) 方法现在仅适用于表。要访问 SQL 视图,请使用 db.view(view_name)。(#657)table.insert_all() 和 table.upsert_all() 方法现在可以接受一个列表或元组的迭代器作为字典的替代方案。第一个元素应为列名的列表/元组。详情请参见从列表或元组迭代器插入数据。(#672)破坏性变更:默认的浮点数列类型已从 FLOAT 更改为 REAL,这是 SQLite 中用于浮点值的正确类型。这会影响插入数据时自动检测的列。(#645)现在使用 pyproject.toml 代替 setup.py 进行打包。(#675)Python API 中的表现在能更好地记住首次创建时的主键和其他模式信息。(#655)破坏性变更:table.convert() 和 sqlite-utils 转换机制不再跳过评估为 False 的值。之前需要使用 --skip-false 选项,现在该选项已被移除。(#542)破坏性变更:由该库创建的表现在在模式中使用 "双引号" 包裹表名和列名。之前使用的是 [方括号]。(#677)--functions CLI 参数现在除了接受包含 Python 代码的字符串外,还可以接受指向 Python 文件的路径。现在也可以多次指定该参数。(#659)破坏性变更:类型检测现在是导入 CSV 或 TSV 数据时 insert 和 upsert CLI 命令的默认行为。之前所有列都视为 TEXT,除非传递了 --detect-types 标志。使用新的 --no-detect-types 标志可以恢复旧的行为。SQLITE_UTILS_DETECT_TYPES 环境变量已被移除。(#679)
#### 尝试一下
你可以通过以下方式安装新的 RC 版本:
pip install sqlite-utils==4.0rc1或者使用 uvx 直接尝试 CLI 版本:
uvx --with sqlite-utils==4.0rc1 sqlite-utils --help在 sqlite-utils Discord 频道中与我们讨论,或在 GitHub Issues 中提交任何问题。
发布于
2026 年 6 月 21 日晚上 11:35 · 关注我在
Mastodon
,
Bluesky
或
订阅我的通讯
更近的文章
- Datasette Apps:在 Datasette 中托管自定义 HTML 应用程序 - 2026 年 6 月 18 日
- GLM-5.2 可能是目前最强大的仅文本的开源权重 LLM - 2026 年 6 月 17 日
#primary
这是 sqlite-utils 4.0rc1 添加迁移和嵌套事务,由 Simon Willison 于 2026 年 6 月 21 日发布。
系列文章:sqlite-utils 的新特性
- sqlite-utils 3.20 和 3.21 的新特性:--lines, --text, --convert - 2022 年 1 月 11 日 下午 6:19
- sqlite-utils 现在支持插件 - 2023 年 7 月 24 日 下午 5:06
- sqlite-utils 4.0a1 有一些(次要的)向后不兼容的更改 - 2025 年 11 月 24 日,下午 2:52
- sqlite-utils 4.0rc1 新增了迁移和嵌套事务功能 - 2026 年 6 月 21 日,晚上 11:35
迁移
17
项目
539
sqlite
468
sqlite-utils
225
带注释的版本说明
56
上一篇:Datasette 应用:在 Datasette 中托管自定义 HTML 应用程序
月度简报
以每月 10 美元赞助我,您将收到一份精选的电子邮件摘要,涵盖本月最重要的 LLM 发展。
让我少发点邮件吧!
赞助并订阅
#secondary
#wrapper
- 披露信息
- 副刊
- ©
- 2002
- 2003
- 2004
- 2005
- 2006
- 2007
- 2008
- 2009
- 2010
- 2011
- 2012
- 2013
- 2014
- 2015
- 2016
- 2017
- 2018
- 2019
- 2020
- 2021
- 2022
- 2023
- 2024
- 2025
- 2026