Подтвердить что ты не робот

Как использовать 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
4b9b3361

Ответ 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)