【问题标题】: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 关系定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-29
      • 2019-08-12
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 2014-01-09
      相关资源
      最近更新 更多