我可以使用 SQLAlchemy 使用聚合表达式吗?

min*_*hee 6 python postgresql sqlalchemy aggregate-functions

PostgreSQL 有聚合表达式,例如count(*) FILTER (WHERE state = 'success'). 如何使用 SQLAlchemy 生成此类表达式?

bak*_*kal 5

假设我有一个Machine带有布尔字段的模型active,并希望通过以下方式过滤计数active = true

使用 func.count(...).filter(...)

from models import db, Machine
from sqlalchemy.sql import func

query = db.session.query(
    func.count(Machine.id).filter(Machine.active == True)
    .label('active_machines')
)
Run Code Online (Sandbox Code Playgroud)

我们可以查看生成的 SQL 查询:

>>> print(query)
SELECT count(machine.id) FILTER (WHERE machine.active = true) AS active_machines 
FROM machine
Run Code Online (Sandbox Code Playgroud)

这应该工作一样像其他聚合函数func.avgfunc.sum

更长的语法使用 funcfilter(count(...), filter)

func.count(Machine.id).filter(Machine.active == True) 是以下的简写:

from sqlalchemy import funcfilter

funcfilter(func.count(Machine.id), Machine.active == True)
Run Code Online (Sandbox Code Playgroud)