2010-05-18 2 views
7

Was ist der Unterschied zwischen der Deklaration der Kaskade innerhalb eines Fremdschlüssels gegenüber Beziehungen?sqlalchemy: Was ist der Unterschied zwischen der Deklaration der Kaskade innerhalb des Fremdschlüssels 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')) 

mit dem Fremdschlüssel Erklärung, wie es scheint, die Kaskade auf Datenbankebene erzwungen wird. Wie funktioniert die Beziehung? Vielen Dank!

Antwort

6

Sie haben Recht, dass die Fremdschlüsselkaskade auf Datenbankebene erfolgt. Vielleicht ist es nicht überraschend, dass der Beziehungsansatz auf Python-Ebene erfolgt. Wenn das Löschen des übergeordneten Elements aus der Sitzung gelöscht wird, liest SQLAlchemy die Beziehung ein und löscht alle Mitglieder, wobei alle anderen Kaskaden verarbeitet werden.

Beachten Sie auch, dass Sie bei der Verwendung der Datenbankkaskade auch die Beziehung konfigurieren müssen, um sich der Tatsache bewusst zu sein.

+0

Also sollte ich wirklich die beiden kombinieren, so dass die Beziehung der Datenbank Kaskade bekannt ist? – steve

+0

Siehe die Dokumentation für passive_updates und passiv_deletes Parameter für die Beziehung Funktion: http://www.sqlalchemy.org/docs/reference/orm/mapping.html#sqlalchemy.orm.relationship –

+0

genial. Danke für die Klarstellung. – steve