我在两种类型的对象 Message 和 URL 之间存在一对多关系。在类 URL 中定义了一个关系,其中包含一个名为“link”的指向 Message 的 backref。有没有办法在查询消息时创建过滤器,以查找例如拥有少于 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 集合,但我可以接受)。
最佳答案
为此,您需要将 Message
与 URL
连接,按 Message
中的所有字段进行分组,并在 中进行过滤>HAVING
子句:
q = session.query(Message).\
join(URL).\
group_by(Message).\
having(func.count(URL.id) < n)
filter()
(在 SQL 中翻译为 WHERE
)在分组和聚合函数之前应用,而 having()
在分组完成后过滤行。
关于python - 使用 backref "length"和 SQLAlchemy 进行过滤的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18189875/