2015-04-21 25 views
10

Diciamo che ho due modelliSQLAlchemy consentire null come 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') 

posso creare nuovo documento con NULL ENTITY_ID. Ma una volta che ho impostato entity_id valido su quel documento non posso più negarlo. Ottengo l'errore:

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

Come si possono impostare null per ENTITY_ID in qualche documento, se ha ENTITY_ID valida?

risposta

5

la definizione ORM sembra corretta, DocumentModel.entity_id è annullabile. Quello che farei in questo caso è controllare la definizione della tabella effettiva in MySQL e accertarsi che corrisponda alla definizione ORM, ad es.

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

Questo è possibile. Il punto che stavo cercando di fare nella mia risposta è che davvero non dovresti farlo. Avere un tasto NULL è essenzialmente un record orfano. Aggiunge la gestione in seguito e quasi sempre richiede la pulizia. JMHO. – rfportilla

-1

null non è valido per una riga secondaria. In alternativa, crea un genitore che viene utilizzato solo per i figli 'null' e imposta la chiave per quell'id. Non capisco davvero lo scopo di questo come non vuoi record orfani. Se la relazione non è in realtà da 1 a molti con una relazione padre figlio, è necessario considerare un diverso tipo di relazione o magari aggiungere un campo per rendere inattivi i record figlio.

+5

Se si sta andando a downvote, si prega di aggiungere un commento sul motivo. Solo un voto negativo non aiuta nessuno. Grazie! – rfportilla