如何在SQLAlchemy查询中使用avg和sum
我想从我的数据集中返回一行总计/平均值,这一行包含某些字段的总和和其他字段的平均值。
我可以通过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 个回答
2
attention = Attention_scores.query
.with_entities(func.avg(Attention_scores.score))
.filter(classroom_number == classroom_number)
.all()
我试了这样做,结果得到了正确的平均值。
56
你不能在这里使用 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)
77
你应该使用类似下面的代码:
from sqlalchemy.sql import func
session.query(func.avg(Rating.field2).label('average')).filter(Rating.url==url_string.netloc)
在这里你不能使用 MyObject.query
,因为 SqlAlchemy 会尝试找一个字段来放 avg
函数的结果,但它找不到。