Simon Willison's Weblog

sqlite-utils 4.0rc1 adds migrations and nested transactions

8.5内容质量

TL;DR · AI 摘要

sqlite-utils 4.0rc1 新增了数据库迁移和嵌套事务功能,提升 SQLite 数据库管理的灵活性和可靠性。

核心要点

  • sqlite-utils 4.0rc1 引入了数据库迁移功能,支持通过 Python 或 CLI 工具执行迁移。
  • 迁移系统不支持回滚,建议通过新迁移覆盖错误。
  • 新增的 db.atomic() 支持嵌套事务,借鉴自 Django 和 Peewee 的术语。

结构提纲

按章节快速跳转。

  1. 介绍 sqlite-utils 4.0rc1 的主要新特性:数据库迁移和嵌套事务。

  2. 迁移功能基于 sqlite-migrate 包,支持通过 Python 或 CLI 工具执行迁移脚本。

  3. 提供一个 migrations.py 文件的示例,展示如何定义和执行迁移。

  4. 迁移系统不支持回滚,建议通过新迁移覆盖错误。

  5. 新增的 db.atomic() 支持嵌套事务,借鉴自 DjangoPeewee 的术语。

  6. 提供一个使用 db.atomic() 的代码示例,展示如何处理嵌套事务。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • sqlite-utils 4.0rc1 新特性
    • 数据库迁移
      • 基于 sqlite-migrate
      • 支持 Python 和 CLI 工具
      • 不支持回滚
    • 嵌套事务
      • db.atomic() API
      • 支持 savepoints
      • 借鉴 Django 和 Peewee

金句 / Highlights

值得收藏与分享的关键句。

#sqlite-utils#SQLite#Python#数据库迁移
打开原文

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 文件中迁移集的示例:

code
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 运行这些迁移:

code
db
=
Database
(
"creatures.db"
)
migrations
.
apply
(
db
)

或者使用命令行 migrate 命令:

code
sqlite-utils migrate creatures.db migrations.py

这个系统设计得非常小巧:它不提供反向迁移,因此您所犯的任何错误都应通过部署一个新的迁移来修复。

它的前身已经被 LLM 和其他各种项目使用了数年,因此我对该设计的稳定性以及其良好的工作方式充满信心。

新的迁移功能在这里有详细文档。

#### 新功能:db.atomic() 事务

与迁移相比,这个功能的使用较少,因此需要测试人员更多的关注。

之前,sqlite-utils 主要将事务管理交给用户,通过 with db.conn: 构造直接重用 sqlite3 机制。

SQLite 支持以保存点形式的嵌套事务,因此我希望有一个抽象,可以尽可能地使这些操作变得容易使用。

我从 Django 和 Peewee 借用了“atomic”这一术语。这是新 API 的示例:

code
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 版本:

code
pip install sqlite-utils==4.0rc1

或者使用 uvx 直接尝试 CLI 版本:

code
uvx --with sqlite-utils==4.0rc1 sqlite-utils --help

在 sqlite-utils Discord 频道中与我们讨论,或在 GitHub Issues 中提交任何问题。

发布于

2026 年 6 月 21 日晚上 11:35 · 关注我在

Mastodon

,

Bluesky

Twitter

订阅我的通讯

更近的文章

  • 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