SQLAlchemy:如何在删除时禁用 ORM 级外键处理?

Posted

技术标签:

【中文标题】SQLAlchemy:如何在删除时禁用 ORM 级外键处理?【英文标题】:SQLAlchemy: how to disable ORM-level foreign key handling on delete? 【发布时间】:2020-04-29 19:36:32 【问题描述】:

我了解到 SQLAlchemy 实现了一些外键处理,例如在删除父级时将它们设置为空,与数据库分开,这意味着它们可以设置为不同的行为,并且可以通过不同的方式来做同样的事情一。示例:

我有CommentSubscription,其中SubscriptionComment 有外键关系。我首先在Subscription的关系上设置backref = backref('subs', cascade = 'delete, delete-orphan'),结果是session.delete(comment)会正确删除评论上的订阅,但session.query(Comment).filter_by(id = id).delete()会因外键违规而失败,因为设置了级联在 ORM 级别而不是 Postgres 级别。

不用说,我觉得这很令人困惑,我想禁用它,以便删除时的所有外键处理都由 Postgres 完成。我没有找到一种明显的方法来查看文档。我读到了passive deletes,这听起来像是我想要的,只是它不适用于已经加载到会话中的对象。

有没有办法在删除时禁用所有 ORM 级别的外键处理?有充分的理由不这样做吗?

【问题讨论】:

【参考方案1】:

嗯,我尝试了被动删除,看来它毕竟可以满足我的需求。 “cascade="all, delete-orphan" 将对会话中当前存在的 MyOtherClass 实例生效”这句话让我认为,如果将依赖对象添加到会话,但是如果我获取依赖对象,然后是依赖对象,然后修改依赖对象,验证它是否在session.dirty 中,然后删除依赖对象并提交,SQLAlchemy 不会手动为依赖对象发出删除。

【讨论】:

以上是关于SQLAlchemy:如何在删除时禁用 ORM 级外键处理?的主要内容,如果未能解决你的问题,请参考以下文章

如何级联删除一对多数据 sqlalchemy

加载关系时如何指示SQLAlchemy ORM并行执行多个查询?

sqlalchemy orm 层面删除数据注意

如何从 SqlAlchemy 中的多对多集合中删除所有项目?

使用 sqlalchemy 的声明性 ORM 扩展时的多列索引

如何在db更新后获取SQLAlchemy ORM对象的先前状态?