python - SQLAlchemy FK ondelete 不限制

标签 python sqlalchemy self-referencing-table

我建立了 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/

相关文章:

Mysql获取最新行的自引用关系

MySQL创建一个可以为空的外键,引用同一个表上的id字段

python - 向集合列表中的元素添加值

python - (PyQt) 为什么我不能更改我的 QTextEdit 小部件的字体?

python - FileNotFoundError : [Errno 2] No such file or directory: . 常量.json

python - 为什么 SQLAlchemy 关联对象中的外键被标记为主键?

python - 更新时重新生成 SQLalchemy 序列

python - 将 pandas 数据框中的一行分解为多行

python - 如何使用sqlalchemy调用存储过程

mysql - 使用自引用列更新 MySQL 表