sqlalchemy:在外键和关系中声明级联有什么区别?

sqlalchemy:在外键和关系中声明级联有什么区别?,sqlalchemy,Sqlalchemy,在外键中声明级联与在关系中声明级联有什么区别 class Contact(Base): __tablename__ = 'contacts' id = Column(Integer, primary_key=True) addresses = relation("Address", backref="contact") class Address(Base): __tablename__ = 'addresses' id = Column(Integer

在外键中声明级联与在关系中声明级联有什么区别

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


使用外键声明,级联似乎是在数据库级别执行的。关系方法是如何工作的?谢谢

在数据库级别执行外键级联是正确的。也许毫不奇怪,关系方法是在Python级别完成的。当父级的删除从会话刷新时,SQLAlchemy读取关系并向所有成员发出删除,处理任何其他级联


还要注意,如果使用数据库级联,您还需要配置关系以了解事实。

因此,我应该真正将两者结合起来,以便关系了解数据库级联?请参阅被动更新和被动删除关系函数参数的文档:@AntsAasma提供的链接已更改为
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'))