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 を送り返しますが、私はそれを受け入れることができます)。