使用SQLAlchemy关系时是否需要外键



阅读以下页面,我可以看到我可以使用ormrelationship()函数设置表之间的关系。

https://docs.sqlalchemy.org/en/13/orm/basic_relationships.html

https://docs.sqlalchemy.org/en/13/orm/backref.html#relationships-backref

使用此示例:

class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String)
addresses = relationship("Address", backref="user")
class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
email = Column(String)
user_id = Column(Integer, ForeignKey('user.id'))

我需要为Address类有一个显式的user_id = Column(Integer, ForeignKey('user.id'))语句吗?

relationship(backref=...)是否是User提供的Address.user属性?

如果Address中需要ForeignKey列,那么为什么User中不需要它呢?

第一:在三种情况下使用外键

  • 您有一个对另一个表的多关键字引用
  • 您要命名外键引用
  • 您希望添加其他功能,例如级联删除

第四个原因也是合理的:因为本地编码标准需要使用显式约束。

第二:根据SQLAchemy文档

事实上,relationship.backref关键字是地址映射上的only a common shortcut for placing a second relationship(),包括在which will mirror attribute operations in both directions两侧建立事件侦听器。

但最好使用back_populates,因为它是显式的。我们显式地向Address添加.user关系。在这两种关系中,relationship.back_populatesdirective tells each relationship about the other one,表示它们应该在彼此之间建立"双向"行为。

class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String)
addresses = relationship("Address", back_populates="user")
class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
email = Column(String)
user_id = Column(Integer, ForeignKey('user.id'))
user = relationship("User", back_populates="addresses")

相关内容

  • 没有找到相关文章