postgresql - SQLAlchemy 表达式语言问题

标签 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)

首先,我得到了一个映射到 tracking_entries 的类 TrackingEntry, 外部连接中的 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

最佳答案

不是一个完整的答案,但是当你想将 select() 对象连接在一起时,它们有一个“.c”。属性,它们有效地获得了与 Table 本身相同的接口(interface)。所以

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, ...))

关于postgresql - SQLAlchemy 表达式语言问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2986410/

相关文章:

python - SQLalchemy/Flask - 一对一嵌套

python - 使用 mod_wsgi 和 Django 提供静态文件

python - 变量的 mod_python 缓存

linux - PostgreSQL 无密码提示 : . pgpass 被忽略

PostgreSQL:如何让 ADD UNIQUE 工作

postgresql - 如何在 Digital Ocean 应用平台上的 .NET Web API 上配置生产连接字符串

python - 在 PostgreSQL 上使用 CTE() 进行 SQLAlchemy 查询

python - SQLAlchemy:返回按列的最大值过滤的记录

python - 使用 mod_python 时导入 python 模块

mysql - 我应该安装32位数据库还是64位数据库?