我正在尝试将其转换为 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)
有人有任何建议或更好的解决方案吗?
最佳答案
不是一个完整的答案,但是当你想将 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/