Как сгенерировать этот запрос в sqlalchemy?

Я хочу сгенерировать этот запрос в sqlalchemy. Таблица «требование» существует в базе данных. Существует подзапрос, который генерирует временные шаги с помощью функции generate_series.

SELECT
    timesteps.timestep AS timestep, d.count AS count
FROM
    (SELECT
        DATE_TRUNC('hour',date_demande) AS timestep,
        COUNT(id) AS count
     FROM
        demande
     GROUP BY
        timestep
    ) AS d

RIGHT OUTER JOIN
    (SELECT
        timestep
     FROM
        generate_series('2010-01-01 00:00:00'::timestamp,
                        '2010-01-01 23:59:59'::timestamp,
                        '1 hour'::interval) AS timestep
     ) AS timesteps
  ON d.timestep = timesteps.timestep

ORDER BY timestep;

Я пробовал это:

stmt = session.query(
        func.
            generate_series(
                datetime.datetime(2010,1,1,0,0,0),
                datetime.datetime(2010,1,1,23,59,59),
                cast('1 hour',Interval())).
            label('timestep')
        ).subquery()
print stmt
q = session.query(
        stmt.c.timestep,
        func.count(Demande.id)).
    outerjoin((Demande, grouped==stmt.c.timestep)).
    group_by(stmt.c.timestep)
print q

Но он жалуется на InvalidRequesError: не удалось найти предложение FROM для присоединения. Я предполагаю, что это вызвано подзапросом.

Если я попытаюсь «инвертировать» запрос, он работает, но выполняет «ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ»:

q = session.query(
        func.count(Demande.id),
        stmt.c.timestep).
    outerjoin((stmt, grouped==stmt.c.timestep)).
    group_by(stmt.c.timestep)

Поскольку в sqlalchemy нет RIGHT OUTER JOIN, я просто хочу найти способ использовать подзапрос в качестве первой таблицы, а таблицу «требования» — в качестве второй. Таким образом, я смогу использовать LEFT OUTER JOIN


person Ghislain Leveque    schedule 23.07.2010    source источник


Ответы (1)


Следующий пример должен дать вам подсказку (при условии, что я правильно догадался, что Demande является декларативной моделью):

joined = stmt.outerjoin(Demande.__table__, Demande.grouped==stmt.c.timestep)
q = session.query(stmt.c.timestep, func.count(Demande.id)).\
        select_from(joined).\
        group_by(stmt.c.timestep)
person Denis Otkidach    schedule 20.10.2010
comment
Надо завтра на работе попробовать, спасибо за ответ, вроде неплохо - person Ghislain Leveque; 25.10.2010
comment
Хорошо, вы меня кое-чему научили, но мне еще нужно поработать над этим, чтобы достичь того, что я ищу. Спасибо, в любом случае - person Ghislain Leveque; 26.10.2010