gpt4 book ai didi

python - SQLAlchemy FK ondelete 不限制

转载 作者:太空宇宙 更新时间:2023-11-04 09:30:26 25 4
gpt4 key购买 nike

我建立了 self 参照关系。一个人可以有一个单亲(或没有),一个人可以有多个 child (或没有)。

因此 NULL 被允许作为 FK:

class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('person.id', ondelete='RESTRICT'))
parent = db.relationship('Person', remote_side=[id], back_populates='children')
children = db.relationship('Person', back_populates='parent')

但是,我希望禁止删除一个人,如果他们是 parent 的话。所以我包含了 ondelete='RESTRICT' 子句,但它没有任何效果。父级被删除时,parent_id 列仍设置为 NULL。

(注意我的 SQLite 连接已将 pragma 外键约束切换为 ON)

为什么当父列被删除时数据库不抛出错误,因此以它作为外键的子列限制了这一点?

最佳答案

您的外键约束设置看起来是正确的,但是您的 ORM 关系没有明确的级联配置,因此它们使用默认值 save-updatemerge .在此默认配置中,通过将外键设置为 NULL 来删除父项时,children 关系会解除孤立子项的关联。我认为在这种情况下,您应该使用 passive_deletes='all'(请参阅 delete 级联的说明)在删除父级时禁用任何 ORM 级级联,以便数据库可以在以下情况下阻止删除它被冲洗了:

class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('person.id', ondelete='RESTRICT'))
parent = db.relationship('Person', remote_side=[id], back_populates='children')
children = db.relationship('Person', back_populates='parent', passive_deletes='all')

关于python - SQLAlchemy FK ondelete 不限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55968951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com