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

时间:2010-05-18 02:24:24

标签: 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, 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'))

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

1 个答案:

答案 0 :(得分:6)

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

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