sqlalchemy relashionship隐含地诱导加入

时间:2016-12-27 13:29:30

标签: python python-2.7 sqlalchemy

我刚才读到,为了在表之间进行连接,我们需要定义一个关系。

我在接受的答案here中读到了它 但是,从文档here我找到了以下引用:

  

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

所以现在我问自己的问题是:
如果我定义了一个关系,我理解我有一个隐式连接,那么为什么人们除了给定的连接之外还要进行另一个显式连接?

1 个答案:

答案 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关系定义。