【问题标题】:How to generate this query in sqlalchemy?如何在 sqlalchemy 中生成此查询?
【发布时间】:2010-07-23 12:41:08
【问题描述】:

我想在 sqlalchemy 中生成这个查询。表'demande' 存在于数据库中。有一个使用 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,我只想找到一种方法将子查询作为第一个表,将“demande”表作为第二个表。这样我就可以使用 LEFT OUTER JOIN

【问题讨论】:

    标签: sql postgresql sqlalchemy


    【解决方案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)
    

    【讨论】:

    • 我明天上班要试试这个,谢谢你的回答,看起来不错
    • 好的,你已经学到了一些东西,但我仍然需要努力实现我想要的。还是谢谢
    猜你喜欢
    • 2020-01-18
    • 1970-01-01
    • 2012-07-15
    • 2014-10-31
    • 2017-06-17
    • 2017-09-28
    • 2013-02-20
    • 2018-09-28
    • 2013-05-30
    相关资源
    最近更新 更多