当表之间没有完全相同的FK时,使用关系指定SQLAlchemy连接

时间:2019-04-14 15:40:52

标签: python sqlalchemy

我正在阅读SQLAlchemy ORM教程,在“使用联接查询”部分(https://docs.sqlalchemy.org/en/latest/orm/tutorial.html#querying-with-joins)中,我有些困惑。

本教程先前设置的模式是一个简单的两表安排,其中Address.user_idUser.id的外键。在“地址”对象中将其设置为user_id = Column(Integer, ForeignKey('users.id'))

基本的连接语法对我来说确实有意义:

session.query(User).join(Address).filter(Address.email_address=='jack@google.com').all()

但是,本教程然后声明:如果没有外键或外键,则使用以下一种形式的Query.join()会更好:

query.join(Address, User.id==Address.user_id)    # explicit condition
query.join(User.addresses)                       # specify relationship from left to right
query.join(Address, User.addresses)              # same, with explicit target
query.join('addresses')                          # same, using a string

第一个例子很有意义:如果没有外键或多个外键,则我们需要通过显式指定联接条件来帮助SQLAlchemy,因为它无法从我们的外键中确定使用哪个来执行联接

但是,最后三个示例对我而言并没有任何意义。我相信User.addresses是我们先前在User对象上设置为relationship的{​​{1}},并且在Address对象relationship("Address", order_by=Address.id, back_populates="user")上有一个副本。但是在没有外键或多个外键的情况下,我看不到指定特定的关系声明对我们的实际帮助。

至少到目前为止,在本教程中,关系声明本身并未指定用于实现该关系的特定外键或列关系。到目前为止,我认为我们希望该关系使用我们确实设置的单个外键只是隐含的。那么是否还有其他情况在关系对象中编码更多信息,即某种联接条件?这是我可以看到的唯一方法,如果两个表之间有零个或多个外键,则指定user = relationship("User", back_populates="addresses")将提供足够的信息来指定连接条件。

0 个答案:

没有答案