2016-06-18 4 views
2

내가 좋아하는 모델 여섯 개 테이블을 가지고 다음 네 가지가SQLAlchemy - 동적 왼쪽 조인을 쿼리에 추가하는 방법?

과 같을 것이다 쿼리, 예를 들어

A 
A, B, C 
A, D, E 
A, B, C, D E 

: 내가 좋아하는 것

+--<B>--C 
| 
A 
| 
+--<D>--E 

동적으로 이러한 옵션 중 하나를 조회 할 수 있도록
q = session.query(A, B, C, D, E) \ 
    .outerjoin(B, A.id == B.a_id).outerjoin(C, C.id == B.c_id) 
    .outerjoin(D, A.id == D.a_id).outerjoin(E, E.id == D.e_id) 

모델을 목록에 추가하고 select 절에서 동적으로 사용할 수 있습니다. 그러나 조인을 동적으로 첨부하는 방법을 알 수 없습니다.

from sqlalchemy import outerjoin 

models = [A] 
joins = [] 

if foo: 
    models.append(B) 
    models.append(C) 
    joins.append(outerjoin(A, B, A.id == B.a_id)) 
    joins.append(outerjoin(B, C, C.id == B.c_id)) 

if bar: 
    models.append(D) 
    models.append(E) 
    joins.append(outerjoin(A, D, A.id == D.d_id)) 
    joins.append(outerjoin(D, E, E.id == D.e_id)) 

q = session.query(*models) 
# How do I attach my joins list to this query? 

내가 작동하지 않았다 다음을 시도, 그리고 그것을 한 경우에도 나는 경우가 foobar이 때 두 FalseFROM 절을 떠날 것이라고 추정 것 : 여기에 지금까지 무엇을 가지고 . 물론

q = q.select_from(*joins) 

은 내가 joins 목록을 없애하고 다음과 같이, q = session.query(*models)를 실행 한 후 if 조건을 반복,하지만 난 오히려 조건부 논리를 한 번 수행 할 수 있습니다.

if foo: 
    q = q.outerjoin(B, A.id == B.a_id).outerjoin(C, C.id == B.c_id) 

if bar: 
    q = q.outerjoin(D, A.id == D.a_id).outerjoin(E, E.id == D.e_id) 

답변

2

outerjoin (및 기타 SLQALchemy 쿼리 방법)은 query 객체를 수정하고 새 쿼리 반환 - 당신이 더 (... 등, 또는 filter) 메소드를 outerjoin를 호출하여 수정할 수 있습니다. 따라서 for 루프를 사용하여 조건에 지정한 각 외부 조인 매개 변수 집합에 대해 outerjoin으로 쿼리를 반복적으로 수정하면됩니다. 매개 변수 자체는 모델처럼으로 미리 작성한 튜플 일 수 있습니다.

models = [A] 
joins = [] 

if foo: 
    models.append(B) 
    models.append(C) 
    joins.append((A, B, A.id == B.a_id)) 
    joins.append((B, C, C.id == B.c_id)) 

if bar: 
    models.append(D) 
    models.append(E) 
    joins.append((A, D, A.id == D.d_id)) 
    joins.append((D, E, E.id == D.e_id)) 

q = session.query(*models) 
for join_args in joins: 
    q = q.outerjoin(*join_args) 

# q is now ready to go with all outerjoins specified. 
관련 문제