Как использовать avg и sum в запросе SQLAlchemy
Я пытаюсь вернуть строку итогов/средних из моего набора данных, который содержит СУММ некоторых полей и 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
Ответы
Ответ 1
Вы должны использовать что-то вроде:
from sqlalchemy.sql import func
session.query(func.avg(Rating.field2).label('average')).filter(Rating.url==url_string.netloc)
Здесь вы не можете использовать MyObject.query
, потому что SqlAlchemy пытается найти поле для вывода результата функции avg
, и он не работает.
Ответ 2
Здесь вы не можете использовать 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)