SQLAlchemy разрешить null как ForeignKey

предположим, у меня есть две модели

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

Как я могу установить null в entity_id в каком-либо документе, если он имеет действительный entity_id?

2 ответов


ваше определение ORM выглядит отлично, DocumentModel.entity_id действительно иметь значение null. В этом случае я бы проверил фактическое определение таблицы в 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 недопустимо для дочерней строки. В качестве альтернативы сделайте родителя, который используется только для "нулевых" детей, и установите ключ к этому идентификатору. Я действительно не понимаю цели этого, так как вы не хотите сиротских записей. Если отношение на самом деле не 1 ко многим с родительским дочерним отношением, следует рассмотреть другой тип отношения или, возможно, добавить поле, чтобы сделать дочерние записи неактивными.