2012-04-06 8 views
1

私はすべてがうまくいくことを願っています。まずは、私のSQLがうまくいかないことは残念です。raw SQLをSQLAlchemyコードに完全に変換する際に助けてください(私は試してみましたが、まだありません)

私は私のコードでSQLAlchemyのの宣言型のスタイルを使用して、ここで私のクエリは

appt_query = alchemy_session.query(Appointment.appointmentId, Appointment.patientId,   func.max(Appointment.apptDate).label('maxTime')).filter(

     Appointment.facilityId == 95, 

).group_by(Appointment.patientId).subquery() 


appointments = alchemy_session.query(Appointment.appointmentId, Appointment.patientId, appt_query.c.maxTime).outerjoin(

      appt_query, and_(
       Appointment.patientId == appt_query.c.patientId, 
       Appointment.apptDate == appt_query.c.maxTime 
      ) 

) 

が、私のように見える方法ですよ

select a.appointmentId, a.patientId, r.MaxTime from (
    select appointmentid, patientid, max(apptDate) as MaxTime 
     from appointment 
     where facilityid=95 
     group by patientid 
    ) r 
inner join 

Appointment a on 
a.patientid = r.patientid and 
a.apptDate = r.MaxTime 

を次のようになります。生のSQLをしましたやる

印刷予定

それは残念ながらSQL tを生成していないです私が欲しい帽子。私はSQLの私の理解に時間があることを知っているので、この上の任意のポインターは本当に役立つでしょう。あなたの時間と助けてくれてありがとう。

+1

:それはうまくsqlalchemy.orm.aliasedによって行われます。生成されるSQLは何ですか? – sayap

+0

MetaDataオブジェクトにアクセスできる場合、metadata.bind.echo = Trueは、sqlalchemyが使用しているSQLを表示します。 – timbo

答えて

0

sayapが述べているように、これは同じクエリに非常に近いです。 .outerjoin().join()に固定した後で残るのは、Appointmentという1つのインスタンスに別名が関連付けられないようにエイリアスを与えることだけです。 `アウター・ジョイン()` SQLAlchemyの中で、私は本当に違いに気付くことができない対生のSQLで `インナーjoin`以外

>>> from sqlalchemy.orm import aliased, Query 
>>> appt_alias = aliased(Appointment) 
>>> appt_query = Query([Appointment.appointmentId, 
...      Appointment.patientId, 
...      func.max(Appointment.apptDate).label('maxTime')]) \ 
...    .filter(Appointment.facilityId == 95,) \ 
...    .group_by(Appointment.patientId) \ 
...    .subquery() 
>>> appointments = Query([appt_alias.appointmentId, 
...      appt_alias.patientId, 
...      appt_query.c.maxTime]) \ 
...     .join(appt_query, and_(
...      appt_alias.patientId == appt_query.c.patientId, 
...      appt_alias.apptDate == appt_query.c.maxTime)) 
>>> 
>>> print appointments 
SELECT appointment_1."appointmentId" AS "appointment_1_appointmentId", appointment_1."patientId" AS "appointment_1_patientId", anon_1."maxTime" AS "anon_1_maxTime" 
FROM appointment AS appointment_1 JOIN (SELECT appointment."appointmentId" AS "appointmentId", appointment."patientId" AS "patientId", max(appointment."apptDate") AS "maxTime" 
FROM appointment 
WHERE appointment."facilityId" = :facilityId_1 GROUP BY appointment."patientId") AS anon_1 ON appointment_1."patientId" = anon_1."patientId" AND appointment_1."apptDate" = anon_1."maxTime" 
関連する問題