2010-05-18 19 views
7

¿cuál es la diferencia entre declarar la cascada dentro de una clave externa vs relaciones?sqlalchemy: ¿cuál es la diferencia entre declarar la cascada dentro de la relación de clave externa?

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

con la declaración de clave externa, parece que la cascada se aplica en el nivel de base de datos. ¿Cómo funciona el acercamiento de las relaciones? ¡Gracias!

Respuesta

6

Tiene razón en que la cascada de la clave externa se realiza en el nivel de la base de datos. Tal vez, como era de esperar, el enfoque de relación se realiza en el nivel de Python. Cuando se borra la eliminación del padre de la sesión, SQLAlchemy lee en la relación y emite eliminar a todos los miembros, procesando cualquier otra cascada.

También tenga en cuenta que si utiliza la cascada de la base de datos, también deberá configurar la relación para tener en cuenta el hecho.

+0

¿Debo realmente combinar los dos para que la relación tenga conocimiento de la cascada de la base de datos? – steve

+0

Consulte la documentación de los parámetros pasiva_actualizaciones y pasivos_deletas para la función de relación: http://www.sqlalchemy.org/docs/reference/orm/mapping.html#sqlalchemy.orm.relationship –

+0

awesome. gracias por la aclaración. – steve

Cuestiones relacionadas