2015-04-21 2 views
10

Скажем, у меня есть две моделиSQLAlchemy позволяют нуль, как 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

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

ответ

5

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

Это возможно. То, что я пытался сделать в своем ответе, состоит в том, что вы действительно не должны этого делать. Наличие ключа NULL по существу является сиротской записью. Он добавляет управление позже и почти всегда требует очистки. JMHO. – rfportilla

-1

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

+5

Если вы собираетесь использовать нижний предел, добавьте комментарий о том, почему. Единственное голосование никому не помогает. Благодаря! – rfportilla

Смежные вопросы