SqlAlchemy:过滤以匹配所有而不是列表中的任何值?

Posted

技术标签:

【中文标题】SqlAlchemy:过滤以匹配所有而不是列表中的任何值?【英文标题】:SqlAlchemy: filter to match all instead of any values in list? 【发布时间】: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 查询问题,这样您就可以提高问题的可见性。 【参考方案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 工具来解决它,但通常您不会选择更长更慢方法,除非真的需要。

以上是关于SqlAlchemy:过滤以匹配所有而不是列表中的任何值?的主要内容,如果未能解决你的问题,请参考以下文章

嵌套的一对多关系 sqlalchemy 过滤

Django:ManyToMany过滤器匹配列表中的所有项目

SQLAlchemy 关系:与两个 ForeignKey 列中的任一个匹配的对象列表

从列表中过滤为查询字符串 postgresql flask sqlalchemy [重复]

Select2 从过滤列表中选择所有选项以进行多项选择

Django-Filter 包:如何过滤对象以创建统计信息而不是列表