49 votes

Comment utiliser avg et sum dans la requête SQLAlchemy

J'essaie de renvoyer une ligne de totaux/moyennes de mon ensemble de données qui contient la SOMME de certains champs et l'AVG d'autres.

Je pourrais le faire en SQL via :

 SELECT SUM(field1) as SumFld, AVG(field2) as AvgFld 
FROM Rating WHERE url=[url_string]

Ma tentative de traduire cela en SQLAlchemy est la suivante :

 totals = Rating.query(func.avg(Rating.field2)).filter(Rating.url==url_string.netloc)

Mais c'est une erreur avec :

 TypeError: 'BaseQuery' object is not callable

77voto

Aidin Points 985

Vous devriez utiliser quelque chose comme :

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

Vous ne pouvez pas utiliser MyObject.query ici, car SqlAlchemy essaie de trouver un champ dans lequel placer le résultat de la fonction avg , et cela échoue.

56voto

Antoine Reversat Points 651

Vous ne pouvez pas utiliser MyObject.query ici, car SqlAlchemy essaie de trouver un champ dans lequel placer le résultat de la fonction avg, et cela échoue.

Ce n'est pas tout à fait vrai. func.avg(Rating.field2).label('average') renvoie un objet Column (le même type d'objet qu'on lui a donné pour être précis). Vous pouvez donc l'utiliser avec la with_entities de l'objet de requête.

Voici comment procéder pour votre exemple :

 Rating.query.with_entities(func.avg(Rating.field2).label('average')).filter(Rating.url == url_string.netloc)

2voto

harish Points 11
attention = Attention_scores.query
    .with_entities(func.avg(Attention_scores.score))
    .filter(classroom_number == classroom_number)
    .all()

Je l'ai essayé comme ça et il a donné la bonne moyenne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X