阅读以下页面,我可以看到我可以使用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")