1

我在两种类型的对象 Message 和 URL 之间有一对多的关系。在类 URL 中定义了一个关系,其中一个名为“link”的反向引用指向 Message。有没有办法在查询消息时进行过滤,以查找例如拥有少于 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()

他们每个人都给我发回一个错误。第一个:

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)

哪个工作正常(发回 KeyedTuple 而不是 Message 集合,但我可以忍受)。

4

1 回答 1

4

为此,您需要加入MessageURL按所有字段分组Message并执行过滤HAVING子句:

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

filter()WHERE(在 SQL中转换为)在分组和聚合函数之前应用,而在分组完成having()过滤行。

于 2013-08-12T17:59:10.047 回答