Как использовать avg и sum в запросе SQLAlchemy - PullRequest
32 голосов
/ 22 августа 2011

Я пытаюсь вернуть итоговую / среднюю строку из моего набора данных, которая содержит сумму определенных полей и 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

Ответы [ 2 ]

50 голосов
/ 22 августа 2011

Вы должны использовать что-то вроде:

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

Вы не можете использовать MyObject.query здесь, потому что SqlAlchemy пытается найти поле для помещения результата функции avg, и это не удается.

39 голосов
/ 03 июля 2013

Вы не можете использовать 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)
...