python - 使用 backref "length"和 SQLAlchemy 进行过滤的方法

标签 python python-2.7 orm sqlalchemy

我在两种类型的对象 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 集合,但我可以接受)。

最佳答案

为此,您需要将 MessageURL 连接,按 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/

相关文章:

java - Hibernate: OneToOne: 同一类型的两个字段

Python 正则表达式 - 匹配和 Start()

python - 'as' 关键字在异常处理中如何工作?

Python:scipy/numpy 两个一维向量之间的所有对计算

python - 图上的 C++ 反向传播;异构载体?

python - 什么是python中的绝对导入?

python-2.7 - 实现文本文件的主题建模后,我得到了相似的词来描述所有主题,结果不准确。

python - 寻找一种快速的方法来加速我的代码

python - 如何在 Django Orm 中获取每个组的最新 n 条记录

java - 使用 JPA 获取集合时避免 N+1 和笛卡尔积问题的标准方法是什么