SQLAlchemy:如何在删除时禁用 ORM 级外键处理?
Posted
技术标签:
【中文标题】SQLAlchemy:如何在删除时禁用 ORM 级外键处理?【英文标题】:SQLAlchemy: how to disable ORM-level foreign key handling on delete? 【发布时间】:2020-04-29 19:36:32 【问题描述】:我了解到 SQLAlchemy 实现了一些外键处理,例如在删除父级时将它们设置为空,与数据库分开,这意味着它们可以设置为不同的行为,并且可以通过不同的方式来做同样的事情一。示例:
我有Comment
和Subscription
,其中Subscription
与Comment
有外键关系。我首先在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 ORM并行执行多个查询?
如何从 SqlAlchemy 中的多对多集合中删除所有项目?