我建立了 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-update和 merge .在此默认配置中,通过将外键设置为 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/