Как добавить условия соединения для многих во многие отношения в SQL Alchemy? - PullRequest
0 голосов
/ 06 января 2019

У меня есть модели A и B, соединенные во взаимосвязи «многие ко многим» с использованием параметра secondary, относящегося к модели AB (таблица ассоциации).

Использование query(A).options(joinedload(A.b)) сгенерирует запрос:

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?

1 Ответ

0 голосов
/ 15 января 2019

Вы можете использовать и _ () выражение с .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_(...))

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...