【问题标题】:sqlalchemy relashionship induce join implicitlysqlalchemy relashionship 隐式诱导加入
【发布时间】:2016-12-28 18:06:06
【问题描述】:
我刚刚读到要在表之间建立连接,我们需要定义一个关系。
例如,我在接受的答案 here 中读到它。
但是,从here 的文档中,我找到了以下引用:
配置关系连接方式
relationship() 通常会通过检查两个表之间的外键关系来确定应该比较哪些列,从而在两个表之间创建连接。
所以现在我问自己的问题是:
如果我定义了一种关系,我知道我有一个隐式连接,那么为什么人们要进行另一个显式连接,除了给定的连接?
【问题讨论】:
标签:
python
python-2.7
sqlalchemy
【解决方案1】:
您无需为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 关系定义。