如何在SQLAlchemy查询中使用avg和sum

时间:2011-08-22 04:39:48

标签: python sqlalchemy flask flask-sqlalchemy

我正在尝试从我的数据集返回一个总计/平均行,其中包含某些字段的SUM和其他字段的AVG。

我可以通过以下方式在SQL中执行此操作:

SELECT SUM(field1) as SumFld, AVG(field2) as AvgFld 
FROM Rating WHERE url=[url_string]

我尝试将其转换为SQLAlchemy如下:

totals = Rating.query(func.avg(Rating.field2)).filter(Rating.url==url_string.netloc)

但这是错误的:

TypeError: 'BaseQuery' object is not callable

3 个答案:

答案 0 :(得分:49)

你应该使用类似的东西:

from sqlalchemy.sql import func
session.query(func.avg(Rating.field2).label('average')).filter(Rating.url==url_string.netloc)

你不能在这里使用MyObject.query,因为SqlAlchemy试图找到一个字段来放置avg函数的结果,但它失败了。

答案 1 :(得分:38)

  

你不能在这里使用MyObject.query,因为SqlAlchemy试图找到一个字段来放置avg函数的结果,但它失败了。

这不完全正确。 func.avg(Rating.field2).label('average')返回一个Column对象(与之相同的类型对象是准确的)。因此,您可以将它与查询对象的with_entities方法一起使用。

这就是你如何为你的例子做的事情:

Rating.query.with_entities(func.avg(Rating.field2).label('average')).filter(Rating.url == url_string.netloc)

答案 2 :(得分:0)

ttention = Attention_scores.query.with_entities(func.avg(Attention_scores.score))。filter(classroom_number ==教室编号).all()

我这样尝试过。它给出了正确的平均值