[英]How do I add join conditions on many to many relationships in SQL Alchemy?
我有模型A
和B
,使用參考模型AB
(關聯表)的secondary
參數以多對多關系連接。
使用query(A).options(joinedload(Ab))
將生成查詢:
SELECT ...
FROM a
LEFT OUTER JOIN (a_b AS a_b_1 JOIN b ON b.id = a_b_1.b_id) ON a.id = a_b_1.a_id
但我想要額外的連接條件(不使用 WHERE!),以便過濾B
的某個標志。 所以就像這樣:
SELECT ...
FROM a
LEFT OUTER JOIN (a_b AS a_b_1 JOIN b ON b.id = a_b_1.b_id AND b.flag = 1) ON a.id = a_b_1.a_id
我如何使用 SQL Alchemy 做到這一點?
您可以使用and_()與.outerjoin表達()。 只是一個有 2 個模型的例子:
from sqlalchemy import and_
class A(Base):
__tablename__ = 'a'
id = Column(Integer, primary_key=True)
class B(Base):
__tablename__ = 'b'
id = Column(Integer, primary_key=True)
a_id = Column(Integer)
flag = Column(String)
a = A()
session.add(a)
session.commit()
# just a few records. without flag + with flag
b1 = B(a_id=a.id)
b2 = B(a_id=a.id, flag='Cs_Is_Better')
session.add(b1)
session.add(b2)
session.commit()
query = session.query(A).outerjoin(B, (and_(A.id == B.a_id, B.flag == 'Cs_Is_Better')))
print(query)
# SELECT a.id AS a_id
# FROM a LEFT OUTER JOIN b ON a.id = b.a_id AND b.flag = %(flag_1)s
print(query.all()) # [<__main__.A object at 0x112fb4780>]
因此,只需向outerjoin
添加任何條件:
.outerjoin(ModelName, (and_(...))
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.