count()、group_by、および order_by を使用して、1 対多の結合を行う必要がある関数がいくつかあります。私は sqlalchemy.select 関数を使用して一連の ID を返すクエリを生成し、それを反復処理して個々のレコードに対して ORM 選択を行います。私が疑問に思っているのは、単一のクエリで ORM を使用して必要なことを実行し、反復を行う必要がないようにする方法があるかどうかです。
これが私が今やっていることの例です。この場合、エンティティは Location と Guide で、1 対多にマッピングされます。関連するガイドの数でソートされた上位の場所のリストを取得しようとしています。
def popular_world_cities(self):
query = select([locations.c.id, func.count(Guide.location_id).label('count')],
from_obj=[locations, guides],
whereclause="guides.location_id = locations.id AND (locations.type = 'city' OR locations.type = 'custom')",
group_by=[Location.id],
order_by='count desc',
limit=10)
return map(lambda x: meta.Session.query(Location).filter_by(id=x[0]).first(), meta.engine.execute(query).fetchall())
解決
これを行うための最良の方法を見つけました。from_statement
a の代わりに afilter_by
またはそのようなものを指定するだけです。そのようです:
meta.Session.query(Location).from_statement(query).all()