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

ste*_*eve 7 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")))
Run Code Online (Sandbox Code Playgroud)

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'))
Run Code Online (Sandbox Code Playgroud)

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

Ant*_*sma 6

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

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