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

mal*_*wan 34 python sqlalchemy flask flask-sqlalchemy

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

我可以在SQL中执行以下操作:

SELECT SUM(field1) as SumFld, AVG(field2) as AvgFld 
FROM Rating WHERE url=[url_string]
Run Code Online (Sandbox Code Playgroud)

我将此转换为SQLAlchemy的尝试如下:

totals = Rating.query(func.avg(Rating.field2)).filter(Rating.url==url_string.netloc)
Run Code Online (Sandbox Code Playgroud)

但这是错误的:

TypeError: 'BaseQuery' object is not callable
Run Code Online (Sandbox Code Playgroud)

Aid*_*din 52

你应该使用类似的东西:

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

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

  • 我认为最好提一下,你必须从sqlalchemy.sql import func`导入` (5认同)

小智 43

你不能在这里使用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)
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案,因为烧瓶 - sqlalchemy (7认同)