PostgreSQL有aggregate expressions,例如count(*) FILTER (WHERE state = 'success')
。如何使用SQLAlchemy生成这样的表达式?
答案 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.avg
,func.sum
等其他聚合函数,这应该是相同的
funcfilter(count(...), filter)
func.count(Machine.id).filter(Machine.active == True)
简写:
from sqlalchemy import funcfilter
funcfilter(func.count(Machine.id), Machine.active == True)