【问题标题】:SQLAlchemy allow null as ForeignKeySQLAlchemy 允许 null 作为 ForeignKey
【发布时间】:2015-06-29 01:35:19
【问题描述】:

假设我有两个模型

class EntityModel(DB.Model):
    id = DB.Column(DB.Unicode(37), primary_key=True)

class DocumentModel(DB.Model):
    id = DB.Column(DB.Unicode(37), primary_key=True)
    entity_id = DB.Column(DB.Unicode(37), DB.ForeignKey('entity.id',   ondelete='cascade'), nullable=True)
    entity = DB.relationship('EntityModel')

我可以创建 entity_id 为 NULL 的新文档。但是,一旦我为该文档设置了有效的 entity_id,我就不能再将它归零。我得到错误:

Cannot add or update a child row: a foreign key constraint fails

如果某个文档具有有效的 entity_id,我如何将 null 设置为 entity_id?

【问题讨论】:

    标签: sql sqlalchemy foreign-keys foreign-key-relationship


    【解决方案1】:

    您的 ORM 定义看起来不错,DocumentModel.entity_id 确实可以为空。在这种情况下,我要做的是检查 MySQL 中的实际表定义并确保它与您的 ORM 定义相对应,例如

    -- make sure DocumentModel.entity_id is nullable :
    SHOW CREATE TABLE DocumentModel\G 
    UPDATE DocumentModel.entity_id SET entity_id = NULL WHERE entity_id = XXX;
    

    【讨论】:

    • 这是可能的。我在回答中试图说明的一点是,你真的不应该这样做。拥有一个 NULL 键本质上是一个孤立的记录。它稍后会增加管理,并且几乎总是需要清理。 JMHO。
    【解决方案2】:

    null 对子行无效。作为替代方案,创建一个仅用于“空”子级的父级并将键设置为该 ID。我真的不明白这样做的目的,因为您不想要孤儿记录。如果关系不是真正的一对多与父子关系,那么您应该考虑不同的关系类型,或者添加一个字段以使子记录处于非活动状态。

    【讨论】:

    • 这没有意义,但 MySQL 完全可以。它允许将子记录设置为空。
    • 嗨,塞比。它只是与数据完整性有关。如果您不强制执行关系,那么这是允许的。但是,它可能会导致孤立的记录。我会说这在 99.9% 的情况下都很糟糕。
    猜你喜欢
    • 2018-04-11
    • 2018-03-09
    • 2013-05-11
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 2021-08-16
    相关资源
    最近更新 更多