在外键中声明级联与关系之间有什么区别?
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'))
使用外键声明,似乎级联是在数据库级别强制执行的。关系方法如何运作?谢谢!
答案 0 :(得分:6)
在数据库级别上完成外键级联是正确的。也许不出所料,关系方法是在Python级别完成的。当从会话中刷新父级的删除时,SQLAlchemy会读取关系并向所有成员发出删除,处理任何其他级联。
另请注意,如果您使用数据库级联,则还需要配置关系以了解事实。