gpt4 book ai didi

python - SQLAlchemy - 通过其子项查询父项,过滤连接以匹配列表中的每个子项

转载 作者:行者123 更新时间:2023-11-28 21:19:52 24 4
gpt4 key购买 nike

我正在尝试查询一个拥有所有请求技能的人。不确定动态构建查询的最佳方式是什么。

ORM 对象如下。 Person 和 Skills 之间的多对多关系,此处不包括连接表:

Person
name=John, skills=[Skill(id=1)] # John knows Python
name=Eve, skills=[Skill(id=1), Skill(id=2)] # Eve knows Python and SQLAlchemy

Skill
id=1, name=Python
id=2, name=SQLAlchemy
id=3, name=Social skills

在搜索页面上,用户选择一项或多项技能,然后基于此创建人员的搜索结果。假设用户想要找到一个了解 Python 和 SQLAlchemy 的人。应用程序从提交的表单 [1, 2] 中获取两个 ID 的列表。我得到了以下关于工作类型的查询,以找到具有匹配技能的人:

session.query(Person)./
join(Skill, Person.skills).filter(Skill.id.in_(list_of_skill_ids))

但是,使用 in_ 子句会导致找到 John 人员,因为他具有所需技能之一。但搜索结果应该只显示具备所有要求技能的人。基本上我想要的是 in_() 之类的东西,但是哪个用户 and 而不是 or 来匹配 id 列表。我可能应该用这个替换 in_() 部分,它不直接获取 id 列表:

filter(Person.id == 1, Person.id == 2)

但是,使用从表单收到的技能 ID 列表以编程方式构建查询的最简单方法是什么? ID 的数量可以是 1..n。或者这是通过其子项查询父项的正确方法吗?

最佳答案

最直接的 SA 解决方案是使用 any对于每项技能:

list_of_skill_ids = [1, 2]
qry = session.query(Person)
for skill_id in list_of_skill_ids:
qry = qry.filter(Person.skills.any(Skill.id == skill_id))

print('\n'.join("{}".format(_) for _ in qry.all()))

对于大型数据集,这可能不是性能最高的查询,但它非常干净。

或者下面也应该有效。 (类似于RedBaron的回答,只是把check直接放在了query中):

qry = (session.query(Person)
.join(Skill, Person.skills)
.filter(Skill.id.in_(list_of_skill_ids))
.group_by(Person)
.having(len(list_of_skill_ids) <= func.count(Skill.id))
)

print('\n'.join("{}".format(_) for _ in qry.all()))

关于python - SQLAlchemy - 通过其子项查询父项,过滤连接以匹配列表中的每个子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23815830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com