python - remove - Cómo usar avg y sum en la consulta SQLAlchemy
sqlalchemy query (2)
Estoy intentando devolver una fila de totales / promedios de mi conjunto de datos que contiene la SUMA de ciertos campos y la AVG de otros.
Podría hacer esto en SQL a través de:
SELECT SUM(field1) as SumFld, AVG(field2) as AvgFld
FROM Rating WHERE url=[url_string]
Mi intento de traducir esto en SQLAlchemy es el siguiente:
totals = Rating.query(func.avg(Rating.field2)).filter(Rating.url==url_string.netloc)
Pero esto es un error de salida con:
TypeError: ''BaseQuery'' object is not callable
No puede usar MyObject.query aquí, porque SqlAlchemy intenta encontrar un campo para poner el resultado de la función avg, y falla.
Esto no es exactamente cierto. func.avg(Rating.field2).label(''average'')
devuelve un objeto Column
(el mismo tipo de objeto que se le dio para ser preciso). Entonces puede usarlo con el método with_entities
del objeto de consulta.
Así es como lo harías por tu ejemplo:
Rating.query.with_entities(func.avg(Rating.field2).label(''average'')).filter(Rating.url == url_string.netloc)
Deberías usar algo como:
from sqlalchemy.sql import func
session.query(func.avg(Rating.field2).label(''average'')).filter(Rating.url==url_string.netloc)
No puede usar MyObject.query
aquí, porque SqlAlchemy intenta encontrar un campo para poner el resultado de la función avg
, y falla.