1

Message と URL という 2 種類のオブジェクトの間に 1 対多の関係があります。関係は、メッセージを指す「リンク」という名前の後方参照を使用して、クラス URL で定義されます。メッセージのクエリ中にフィルタを作成して、たとえば n 個未満の URL を持つメッセージを見つける方法はありますか?

私は試してみました:

session.query(Message).filter(len(Message.link) < n).all()

そして

from sqlalchemy import func
session.query(Message).filter(func.count(Message.link) < n).all()

それらのそれぞれが私にエラーを送り返しています。最初の1つ:

InstrumentedAttribute has no len()

二番目:

DatabaseError: (DatabaseError) ORA-00934: group function is not allowed here

Audrius Kažukauskas のおかげで、いくつかいじった後、次のクエリを実行できました。

session.query(Message.message_id)\
       .join(URL)
       .group_by(Message.message_id)
       .having(func.count(URL.url_id) <= n)

これは正常に動作します (Message のコレクションではなく KeyedTuple を送り返しますが、私はそれを受け入れることができます)。

4

1 に答える 1

4

これを機能させるには、 で結合MessageURL、 in のすべてのフィールドでグループ化し、 in句Messageでフィルタリングを行う必要があります。HAVING

q = session.query(Message).\                                                     
    join(URL).\                                                                  
    group_by(Message).\                                                          
    having(func.count(URL.id) < n)

filter()(SQL では に変換されます) は、グループ化および集計関数の前にWHERE適用されますが、グループ化が完了したに行をフィルター処理します。having()

于 2013-08-12T17:59:10.047 に答える