[英]SQLAlchemy relationship with self-referential secondary
我有以下情况:
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=...)
您需要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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.