gpt4 book ai didi

python - 使用sqlalchemy删除父项时如何使子项的外键无效?

转载 作者:太空宇宙 更新时间:2023-11-03 13:14:24 26 4
gpt4 key购买 nike

我有一个带有 ParentChild 模型的基本 Flask 应用程序:

class Parent(db.Model):
__tablename__ = 'parents'

id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)


class Child(db.Model):
__tablename__ = 'children'

id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('parents.id'), nullable=False)
parent = db.relationship('Parent', backref=db.backref('children', cascade='all,delete'))
name = db.Column(db.String)

作为数据库,如果它很重要,我会使用 Postgres。现在我想执行以下操作:从子项中删除 cascade='all,delete' 并使此 parent_id 可为空。 IE。当 Parent 从 DB Child 中移除时,parent_id == NULL 保持不变。

我知道我可以使用向 FK 添加约束的模式创建脚本来指定它。但我只想将其标记为 NULL 并允许 SqlAlchemy 控制 child FK 的无效化。

最佳答案

relevant section 中有解释非常详细的文档。确保您还阅读了“ORM 级“删除”级联与外键级“删除时”级联”部分,以了解建议解决方案之间的差异。

ORM级别

Now I want to do following: remove cascade='all,delete' from child and make this parent_id nullable.

这样做,你就会得到你想要的确切行为。

class Child(db.Model):
__tablename__ = 'children'

id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('parents.id'), nullable=True)
parent = db.relationship('Parent', backref=db.backref('children'))
name = db.Column(db.String)

另请注意,allsave-update, merge, refresh-expire, expunge, delete 的同义词,因此 all, delete 与简单的 all 相同。

数据库级别

如果你想在数据库级别有ON DELETE SET NULL约束,你可以指定ondelete='SET NULL'ForeighKey 定义中或什么也不做(因为它是外键的默认行为)。要使其在数据库级别上工作,您还需要设置 passive_deletesTrue'all'(请参阅文档了解差异)。

class Child(db.Model):
__tablename__ = 'children'

id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('parents.id', ondelete='SET NULL'), nullable=True)
parent = db.relationship('Parent', backref=db.backref('children', passive_deletes=True))
name = db.Column(db.String)

关于python - 使用sqlalchemy删除父项时如何使子项的外键无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34497812/

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