代码之家  ›  专栏  ›  技术社区  ›  Ghislain Leveque

如何在sqlalchemy中生成此查询?

  •  6
  • Ghislain Leveque  · 技术社区  · 14 年前

    我想在sqlalchemy中生成这个查询。数据库中存在表“demande”。有一个子查询使用generate\ u 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
    

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

    由于sqlalchemy中没有正确的外部联接,所以我只想找到一种方法,将子查询作为第一个表,将“demande”表作为第二个表。这样我就可以使用左外连接

    1 回复  |  直到 14 年前
        1
  •  3
  •   Denis Otkidach    14 年前

    下面的示例应该给您一个线索(假设我正确地猜测了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)