4

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_statementa の代わりに afilter_byまたはそのようなものを指定するだけです。そのようです:

meta.Session.query(Location).from_statement(query).all()
4

3 に答える 3

2

これは難しい方法だと思いましたが、SQLAlchemy は をサポートしていgroup_byます。Query の下のドキュメントにはそうは書かれていませんが、それはサポートしています - 私はそれを使用しました!

また、 も使用できますorder_by。あなたのように特別なクラス/クエリを作成するつもりでしたが、group_by()関数があることがわかりました。

于 2009-03-24T22:17:06.157 に答える
1

あなたがやろうとしていることは、[現在のselect呼び出しから作成された]サブクエリとテーブルの間のSQLAlchemy結合に直接マップされます。サブセレクトから順序付けを移動し、count(desc); でラベル付けされた別の列を作成する必要があります。その列で外側の選択を注文します。

それ以外には、自明でないことはあまりありません。

于 2008-12-16T07:30:29.483 に答える
0

これを行うための最良の方法を見つけました。from_statementa の代わりに afilter_byまたはそのようなものを指定するだけです。そのようです:

meta.Session.query(Location).from_statement(query).all()
于 2009-01-22T12:03:15.540 に答える