我刚才读到,为了在表之间进行连接,我们需要定义一个关系。
我在接受的答案here中读到了它 但是,从文档here我找到了以下引用:
配置关系如何加入 relationship()通常会通过检查两个表之间的外键关系来确定两个表之间的连接,以确定应该比较哪些列。
所以现在我问自己的问题是:
如果我定义了一个关系,我理解我有一个隐式连接,那么为什么人们除了给定的连接之外还要进行另一个显式连接?
答案 0 :(得分:2)
您无需为join定义关系。 relationship在映射的类之间,或者换句话说是ORM概念;你有对象具有相关对象的集合等。当需要显式SQL时,可以使用连接。
定义关系不会让你在SQL JOIN
子句中隐式连接,因为它们在默认情况下是惰性的。另一方面,您可以configure关系如何加载相关对象,例如使用热切的joinedload。
至于为什么有人会使用显式连接,即使存在关系:您不能执行服务器端操作,例如需要与关系连接的聚合。另一方面,您可能不需要任何这些,并对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
不涉及ORM关系定义。