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')

Я могу создать новый Document с сущностью_NULL. Но как только я установил действительный entity_id в этот документ, я больше не могу его вернуть. Я получаю сообщение об ошибке:

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

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

Ответ 1

ваше определение 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;

Ответ 2

null недействительно для дочерней строки. В качестве альтернативы создайте родителя, который используется только для дочерних элементов "null" и установите ключ для этого идентификатора. Я не совсем понимаю цель этого, так как вы не хотите сиротских записей. Если отношения не являются действительно 1 для многих с родительскими отношениями с потомками, тогда вы должны рассмотреть другой тип отношения или, возможно, добавить поле, чтобы сделать дочерние записи неактивными.