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

49 投票
3 回答
55347 浏览
提问于 2025-04-17 00:05

我想从我的数据集中返回一行总计/平均值,这一行包含某些字段的总和和其他字段的平均值。

我可以通过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 函数的结果,但它找不到。

撰写回答