2010-05-18 4 views
7

Quelle est la différence entre déclarer la cascade dans une clé étrangère et les relations?sqlalchemy: quelle est la différence entre déclarer la cascade dans la clé étrangère vs relation?

class Contact(Base): 
    __tablename__ = 'contacts' 
    id = Column(Integer, primary_key=True) 
    addresses = relation("Address", backref="contact") 

class Address(Base): 
    __tablename__ = 'addresses' 
    id = Column(Integer, primary_key=True) 
    contact_id = Column(Integer, ForeignKey('contact.id', onupdate="CASCADE", ondelete="CASCADE"))) 

vs

class Contact(Base): 
    __tablename__ = 'contacts' 
    id = Column(Integer, primary_key=True) 
    addresses = relation("Address", backref="contact", cascade="all, delete-orphan") 

class Address(Base): 
    __tablename__ = 'addresses' 
    id = Column(Integer, primary_key=True) 
    contact_id = Column(Integer, ForeignKey('contact.id')) 

avec la déclaration clé étrangère, il semble que la cascade est appliquée au niveau de la base de données. comment fonctionne l'approche relationnelle? Merci!

Répondre

6

Vous avez raison de dire que la cascade de clé étrangère est effectuée au niveau de la base de données. Peut-être sans surprise, l'approche relationnelle est faite au niveau Python. Lorsque la suppression du parent est supprimée de la session SQLAlchemy lit dans la relation et émet la suppression à tous les membres, le traitement de toutes les autres cascades.

Notez également que si vous utilisez la cascade de base de données, vous devez également configurer la relation pour être au courant du fait.

+0

Donc, je devrais vraiment combiner les deux afin que la relation est au courant de la cascade de la base de données? – steve

+0

Voir la documentation pour les paramètres passive_updates et passive_deletes pour la fonction de relation: http://www.sqlalchemy.org/docs/reference/orm/mapping.html#sqlalchemy.orm.relationship –

+0

awesome. Merci pour la clarification. – steve

Questions connexes