【问题标题】:SQLAlchemy relationship with self-referential secondarySQLAlchemy 与自引用辅助的关系
【发布时间】:2017-11-29 19:57:34
【问题描述】:

我有以下场景:

class A(Base):
    a_string = Column(String)

class B(Base):
    id = Column(Integer, primary_key=True)

class C(Base):
    b_id = Column(Integer, ForeignKey(B.id))
    value = Column(String)

我需要做以下查询:

SELECT c2.*
  FROM a
  JOIN c c1 on c1.value = a.a_string
  JOIN c c2 on c2.b_id = c1.b_id

问题是我需要在模型 A 内部的关系中进行上述查询。类似于:

class A(Base):
    a_string = Column(String)
    c_list = relationship('C', secondary=...)

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    您需要 C 的别名才能自行加入:

    In [3]: c_to_c = aliased(C.__table__)
    

    然后,您可以定义主连接和辅助连接以满足您的需求。这种关系应该只能查看:

    In [4]: A.c_list = relationship(
       ...:     C, secondary=c_to_c,
       ...:     primaryjoin=A.a_string == c_to_c.c.value,
       ...:     secondaryjoin=C.b_id == c_to_c.c.b_id,
       ...:     viewonly=True
       ...: )
    

    然后,您可以验证您是否可以使用联合预加载:

    In [5]: print(session.query(A).options(joinedload(A.c_list)))
    SELECT a.id AS a_id, a.a_string AS a_a_string, c_1.id AS c_1_id, c_1.b_id AS c_1_b_id, c_1.value AS c_1_value 
    FROM a LEFT OUTER JOIN (c AS c_2 JOIN c AS c_1 ON c_1.b_id = c_2.b_id) ON a.a_string = c_2.value
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 2023-03-17
      • 2015-08-01
      • 2015-05-03
      • 2014-09-30
      • 2021-11-23
      • 1970-01-01
      相关资源
      最近更新 更多