48

特定のフィールドの 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
4

3 に答える 3

70

次のようなものを使用する必要があります。

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

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

于 2011-08-22T05:03:34.283 に答える
55

ここで 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)
于 2013-07-02T20:13:51.010 に答える