2010-06-06 2 views
3

이것을 sqlalchemy 표현식 언어 호환 가능으로 변환하려고 시도 중입니다. 상자를 벗어날 수 있는지 모르겠으며 은 더 많은 경험이있는 사람이 나를 도울 수 있기를 바랍니다. 백엔드 는 PostgreSQL을하고 내가 표현으로 그것을 만들 수 없다면 내가 대신 에게 문자열을 만듭니다 : 모든SQLAlchemy 표현식 언어 문제

SELECT 
    DISTINCT date_trunc('month', x.x) as date, 
    COALESCE(b.res1, 0) AS res1, 
    COALESCE(b.res2, 0) AS res2 
FROM 
    generate_series(
     date_trunc('year', now() - interval '1 years'), 
     date_trunc('year', now() + interval '1 years'), 
     interval '1 months' 
    ) AS x 
LEFT OUTER JOIN(
    SELECT 
     date_trunc('month', access_datetime) AS when, 
     count(NULLIF(resource_id != 1, TRUE)) AS res1, 
     count(NULLIF(resource_id != 2, TRUE)) AS res2 
    FROM tracking_entries 
    GROUP BY 
     date_trunc('month', access_datetime) 
    ) AS b 
ON (date_trunc('month', x.x) = b.when) 

먼저 나는 tracking_entries에 매핑 클래스 TrackingEntry, select 문 내에있어 외부는 내가 빌드 방법 아무 생각이없는 외부 select 문을 고려하면 (의사) :

from sqlalchemy.sql import func, select 
from datetime import datetime, timedelta 

stmt = select([ 
    func.date_trunc('month', TrackingEntry.resource_id).label('when'), 
    func.count(func.nullif(TrackingEntry.resource_id != 1, True)).label('res1'), 
    func.count(func.nullif(TrackingEntry.resource_id != 2, True)).label('res2') 
    ], 
    group_by=[func.date_trunc('month', TrackingEntry.access_datetime), ]) 

같은 것을 로 변환 할 수 합류, 내 생각 엔 뭔가 같은 :

outer = select([ 
     func.distinct(func.date_trunc('month', ?)).label('date'), 
     func.coalesce(?.res1, 0).label('res1'), 
     func.coalesce(?.res2, 0).label('res2') 
    ], 
    from_obj=[ 
     func.generate_series(
       datetime.now(), 
       datetime.now() + timedelta(days=365), 
       timedelta(days=1) 
      ).label(x) 
    ]) 

그럼 내가 외래 키 ::

outer.outerjoin(stmt???).??(func.date_trunc('month', ?.?), ?.when) 

누구나 가지고 제안이나 더 나은 솔루션을 사용하지 않고 함께 그 문을 연결해야 가정? 당신이 함께) (선택 가입 오브젝트 할 때

http://pastie.org/994367

답변

1

하지 전체 대답하지만 그들은 "이 .c을."가 속성을 사용하면 테이블 자체와 동일한 인터페이스를 효과적으로 얻을 수 있습니다. 그래서

s1 = select(...) 
s2 = select(...) 

s3 = select([s1,s2]).select_from(s1.join(s2, s1.c.foo==s2.c.bar)) 

같은 함수

select ([func.foo(s1.c.x)]).select_from(s1.join(s2, ...)) 
+0

감사에 적용, 지금은 그것을 해결했습니다. 디버거 모드에서 전자 메일 관리자를 실행하면 결과 쿼리가 실제로 어떻게 보이는지 쉽게 알 수 있었고 문제가 어디에 있는지 파악할 수있었습니다. 나도 선택의 하나에 .alias (somename)를 사용해야했다. postgresql은 익명의 이름 지정을 사용하지 않았다. – Torkel