Sqlalchemy Relashionship诱导隐式加入



我刚刚读到为了在表之间加入,我们需要定义一个关系。

我在这里接受的答案中读了它。
但是,从这里的文档中,我找到了以下报价:

配置关系如何加入 关系()通常通过检查两个表之间的外键关系以确定应比较哪些列之间的外键关系。

所以我问自己的问题是:
如果我定义了一段关系,我知道我有一个隐式加入,那么为什么人们除了给定的一个明确的加入呢?

您不需要定义关系即可加入。映射类之间的关系是一个关系,换句话说是一个ORM概念。您的对象具有相关对象等的集合等。加入是针对当您需要明确的SQL时的。

定义关系不会使您在SQL JOIN子句中隐含地加入,因为它们默认情况下是懒惰的。另一方面,您可以配置关系如何加载相关对象并使用急切的加入载荷。

即使某人之间的关系也可以使用明确的连接:您无法执行服务器端操作,例如需要与关系加入的聚合。另一方面,您可能不需要任何东西,并且对ORM完全满意。

在您链接到关系的答案中,连接不需要。加入目标实体(或可选)只需要两者之间存在外键关系。例如:

In [2]: class A(Base):
   ...:     id = Column(Integer, primary_key=True)
   ...:     __tablename__ = 'a'
   ...:     
In [4]: class B(Base):
   ...:     id = Column(Integer, primary_key=True)
   ...:     a_id = Column(Integer, ForeignKey('a.id'))
   ...:     __tablename__ = 'b'
   ...:     
In [6]: print(session.query(B).join(A))
SELECT b.id AS b_id, b.a_id AS b_a_id 
FROM b JOIN a ON a.id = b.a_id

无涉及的关系定义。

最新更新