2017-11-24 1 views
0
여기

내가 ORM SQLAlchemy의 번역하고자하는 포스트 그레스 쿼리입니다 : 그것은 할 수없는 경우SQLAlchemy의 : 도움이 필요가 ORM이 복잡한 원시 쿼리를 번역하는 (하위 쿼리, 윈도우 함수)

SELECT 
    * 
FROM 
    (
    SELECT 
     *, 
     date_trunc(
     'hour', 
     time_obs + INTERVAL '15' MINUTE 
    ) AS usedTimestamp, 
     ROW_NUMBER() OVER(
     PARTITION BY icao, 
     date_trunc(
      'hour', 
      time_obs + INTERVAL '15' MINUTE 
     ) 
     ORDER BY 
     LEAST(
      EXTRACT(
      MINUTE 
      FROM 
       time_obs 
     ), 
      60 - EXTRACT(
      MINUTE 
      FROM 
       time_obs 
     ) 
     ) 
    ) AS seqnum 
    FROM 
     metar_current 
    WHERE 
     icao = 'DGAA' 
) AS dt 
WHERE 
    seqnum = 1 
AND LEAST(
    ` EXTRACT(
    MINUTE 
    FROM 
     time_obs 
), 
    60 - EXTRACT(
    MINUTE 
    FROM 
     time_obs 
) 
) <= 15 
ORDER BY 
    time_obs ASC 

(또는 to this to sqlalchemy ORM으로 변환하는 것입니다. 그런 다음 원시 SQL로 쿼리 할 수 ​​있지만 컬럼 이름을 사용하여 결과 데이터를 참조 할 수있는 방법이 있습니까?

+1

"이 [원시] SQL 쿼리 할 수 ​​:"[Query.from_statement()'] (http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm .query.Query.from_statement)를 사용하면 ORM 엔터티를 반환하는 SQL 문에 대해 쿼리를 실행할 수 있습니다. –

답변

0

시간이 좀 걸렸지 만 스스로 해결할 수있었습니다.하지만 이것이 최적의 방법이라고 확신하지는 않습니다.

seqnum = func.row_number().over(
    partition_by=[Metar.icao, 
        func.date_trunc('hour', Metar.time_obs + text("INTERVAL '15' MINUTE")) 
        ], 
    order_by=func.least(func.extract("MINUTE", Metar.time_obs), 
         60 - func.extract("MINUTE", Metar.time_obs))).label('seqnum') 

dt = session.query(Metar, 
        func.date_trunc('hour', Metar.time_obs + text("INTERVAL '15' MINUTE")).label('usedTimestamp'), 
        seqnum 
        ).filter(Metar.icao == icao).subquery('dt') 

q = session.query(Metar, dt.c.usedTimestamp).filter(dt.c.seqnum == 1, 
                dt.c.icao == Metar.icao, 
                dt.c.time_obs == Metar.time_obs, 
                func.least(func.extract("MINUTE", Metar.time_obs), 
                   60 - func.extract("MINUTE", Metar.time_obs)) < 15) \ 
    .order_by(Metar.time_obs).all() 

내가 Metar의 클래스 속성에 의해 결과 데이터에 액세스 할 수 있도록했다 단지 원래의 원시 쿼리로 dt에서 선택하는 대신 dtMetar에 가입하는 이유.

관련 문제