You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLAlchemy中passive_deletes="all"的适用场景(结合PostgreSQL)

SQLAlchemy 级联删除的几种处理方案

SQLAlchemy 提供了三种级联删除的处理方式,下面分别说明:

1. ORM 自行处理级联删除

默认 passive_deletes=False,只需在 relationship() 配置中加入 cascade="{...}, delete"(比如 cascade="save-update, merge, delete"),ORM 就会主动生成子对象的 DELETE 语句,全程由 ORM 负责级联删除逻辑。

2. 交由数据库处理级联删除

设置 passive_deletes=True,相当于告诉 ORM:「数据库已配置 ON DELETE CASCADE 外键规则」,ORM 会跳过对子对象的删除操作,把级联逻辑完全交给数据库执行,减少 ORM 层面的额外操作。

3. 特殊参数 passive_deletes="all" 的情况

这个参数的适用场景一直比较模糊,经实际测试后发现:

  • 设置该参数后,删除父对象时,无论子对象是否已加载到会话中,ORM 都不会生成任何针对子对象的 DELETE 语句,生成的 SQL 和完全不配置 passive_deletes、也不加 cascade="delete" 时完全一致。
  • 如果数据库已配置 ON DELETE CASCADE,最终数据库的数据状态是正确的,但不确定 ORM 内部对级联删除的感知差异会不会引发潜在问题(比如会话内对象状态不一致)。
  • 当 passive_deletes="all" 和任何 delete 类的级联规则(比如 cascade="delete")共存时,会直接抛出异常,推测它只能用在完全由数据库处理级联删除的场景下。

另外有资料显示这个参数可能已过时,官方文档提到它用于「禁用子外键置空」,属于特殊场景配置,但目前没有找到具体的实际应用案例。

内容的提问来源于stack exchange,提问作者Moley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:13:15