48

我正在尝试从我的数据集中返回总计/平均值行,其中包含某些字段的 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
4

3 回答 3

70

你应该使用类似的东西:

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

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

于 2011-08-22T05:03:34.283 回答
55

你不能在这里使用 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)
于 2013-07-02T20:13:51.010 回答
2
attention = Attention_scores.query
    .with_entities(func.avg(Attention_scores.score))
    .filter(classroom_number == classroom_number)
    .all()

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

于 2020-05-27T04:41:44.827 回答