SQLAlchemy表达式语言问题

时间:2010-06-06 23:48:25

标签: postgresql sqlalchemy mod-python

我正在尝试将此转换为sqlalchemy表达式 语言兼容,我不知道是否可以开箱即用 希望有经验的人可以帮助我。后端 是PostgreSQL,如果我不能把它作为一个表达式我将创建 改为字符串::

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)

首先,我将一个TrackingEntry类映射到tracking_entries, 外连接中的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 个答案:

答案 0 :(得分:1)

不是完整的答案,但是当你想要将select()对象连接在一起时,它们会有一个“.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, ...))