【问题标题】:SqlAlchemy: filter to match all instead of any values in list?SqlAlchemy:过滤以匹配所有而不是列表中的任何值?
【发布时间】:2012-11-01 05:42:31
【问题描述】:

我想在联结表中查询aID 列的值,该值与bID 列中的ID 列表ids=[3,5] 的所有值匹配。

这是我的联结表 (JT):

 aID    bID
   1      1
   1      2
   2      5
   2      3
   1      3
   3      5

我有这个问题:session.query(JT.aID).filter(JT.bID.in_(ids)).all()

此查询返回aID123,因为它们在bID 列中都有带有35 的行。我希望查询返回的是2,因为这是唯一一个在其bID 列中包含ids 列表的所有值的aID 值。

不知道如何更好地解释问题,但我怎样才能得到结果?

【问题讨论】:

  • 我可能会将您的一个标签换成通用的sql 标签,因为这实际上是一个通用的 SQL 查询问题,这样您就可以提高问题的可见性。

标签: python mysql sql sqlalchemy


【解决方案1】:

基于@Gordon Linoff 的回答和两个表AB 其中A 有一个关系- 对B 的多对多调用A.bs SqlAlchemy 等效项是:

from sqlalchemy import func  
session.query(A).join(B).filter(B.id.in_(<your_list>)).group_by(A.id).having(func.count(A.bs) == len(<your_list>)).all()

【讨论】:

    【解决方案2】:

    试试:

        session.query(JT.aID).filter(not_(JT.bID.in_(ids))).all()
    

    【讨论】:

      【解决方案3】:

      您正在寻找适用于行集的查询。我认为使用有子句的分组是最好的方法:

      select aid
      from jt
      where bid in (<your list>)
      group by aid
      having count(distinct bid) = 2
      

      如果您可以将所需的 id 放入表格中,则可以执行以下更通用的方法:

      select aid
      from jt join
           bids
           on jf.bid = bids.bid
      group by aid
      having count(distinct jt.bid) = (select count(*) from bids)
      

      【讨论】:

      • SqlAlchemy 对此有特定的语法还是必须在 SQL 中?
      • SQLAlchemy 能够使用其 SQL 表达式语言生成类似的查询,在其文档中对此进行了很好的介绍,尽管在获得它之前您可能需要对 Python 语法进行一些试验。或者,sqlalchemy 还允许您以文本文字的形式发出直接查询。最后,如果您确实需要动态构建查询,根据程序逻辑中发生的情况从组件中组装它,那么您可以使用 sqlalchemy 的 ORM 工具来解决它,但通常您不会选择更长更慢方法,除非真的需要。
      猜你喜欢
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      相关资源
      最近更新 更多