web-dev-qa-db-ja.com

SQLAlchemyクエリで平均と合計を使用する方法

データセットから特定のフィールドのSUMと他のフィールドの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
34
mal-wan

あなたは次のようなものを使うべきです:

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

ここではMyObject.queryを使用できません。SqlAlchemyがavg関数の結果を格納するフィールドを見つけようとして、失敗するためです。

52
Aidin

ここでは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)
46