2016-06-30 2 views
2

나는 플라스크 - SQLAlchemy의 호출에이 SQL 쿼리를 번역하기 위해 노력하고있어 상관 관계 쿼리를 만들 수 있습니다 :우리는 SQLAlchemy의

SELECT * 
FROM "ENVOI" 
WHERE "ID_ENVOI" IN (SELECT d."ID_ENVOI" 
        FROM "DECLANCHEMENT" d 
        WHERE d."STATUS" = 0 
            AND d."DATE" = (SELECT max("DECLANCHEMENT"."DATE") 
            FROM "DECLANCHEMENT" 
            WHERE "DECLANCHEMENT"."ID_ENVOI" = d."ID_ENVOI")) 

당신이 볼 수 있듯이,이 하위 쿼리를 사용하고, 가장 중요한 부분 중 하나 하위 쿼리는 상관 쿼리 (외부 쿼리에 정의 된 d 테이블 사용)입니다.

subquery() 함수와 하위 쿼리를 사용하는 방법을 알고 있지만 SQLAlchemy와 상관 쿼리에 대한 설명서를 찾을 수 없습니다. 어떻게 할 수 있는지 알고 있습니까?

+2

"상관 하위 쿼리는" "동기화 된 하위 쿼리"보다 훨씬 더 일반적인 용어입니다. [튜토리얼] (http://docs.sqlalchemy.org/en/latest/core/tutorial.html#correlated-subqueries)에서 예제를 찾을 수 있습니다. – univerio

답변

0

, 나는 나의 요청에 대해이 코드를 수행했습니다

Declch = db.aliased(Declanchement) 

maxdate_sub = db.select([db.func.max(Declanchement.date)])\ 
       .where(Declanchement.id_envoi == Declch.id_envoi) 

decs_sub = db.session.query(Declch.id_envoi)\ 
      .filter(Declch.status == SMS_EN_ATTENTE)\ 
      .filter(Declch.date < since)\ 
      .filter(Declch.date == maxdate_sub).subquery() 

envs = Envoi.query.filter(Envoi.id_envoi.in_(decs_sub)).all() 
2

예, 가능합니다.

다음 예제 (특히 correlate 메소드 호출)를 살펴 유무 :

from sqlalchemy import select, func, table, Column, Integer 

table1 = table('table1', Column('col', Integer)) 
table2 = table('table2', Column('col', Integer)) 


subquery = select(
    [func.if_(table1.c.col == 1, table2.c.col, None)] 
).correlate(table1) 

query = (
    select([table1.c.col, 
      subquery.label('subquery')]) 
    .select_from(table1) 
) 

if __name__ == '__main__': 
    print(query) 

다음 쿼리

SELECT table1.col, (SELECT if(table1.col = :col_1, table2.col, NULL) AS if_1 
FROM table2) AS subquery 
FROM table1 

가 발생합니다 당신이 볼 수 있듯이, 당신은에 correlate를 호출하는 경우 select, 주어진 Table은 그것에 추가되지 않습니다 FROM - 절. select_from을 직접 지정하는 경우에도이 작업을 수행해야합니다. SQLAlchemy가 찾은 테이블을 기꺼이 추가하기 때문입니다. univerio의 주석에서 링크를 기반으로