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

时间:2017-11-16 08:09:04

标签: python postgresql sqlalchemy aggregate-functions

PostgreSQL有aggregate expressions,例如count(*) FILTER (WHERE state = 'success')。如何使用SQLAlchemy生成这样的表达式?

1 个答案:

答案 0 :(得分:2)

假设我有一个带有布尔字段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')
)

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

>>> print(query)
SELECT count(machine.id) FILTER (WHERE machine.active = true) AS active_machines 
FROM machine

对于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)