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()
此查询返回aID
值1
、2
和3
,因为它们在bID
列中都有带有3
或5
的行。我希望查询返回的是2
,因为这是唯一一个在其bID
列中包含ids
列表的所有值的aID
值。
不知道如何更好地解释问题,但我怎样才能得到结果?
【问题讨论】:
我可能会将您的一个标签换成通用的sql
标签,因为这实际上是一个通用的 SQL 查询问题,这样您就可以提高问题的可见性。
【参考方案1】:
基于@Gordon Linoff 的回答和两个表A
和B
其中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:过滤以匹配所有而不是列表中的任何值?的主要内容,如果未能解决你的问题,请参考以下文章
Django:ManyToMany过滤器匹配列表中的所有项目
SQLAlchemy 关系:与两个 ForeignKey 列中的任一个匹配的对象列表