gpt4 book ai didi

python - SQLAlchemy:过滤多对多但返回所有结果

转载 作者:行者123 更新时间:2023-11-29 13:59:23 28 4
gpt4 key购买 nike

从多对多博客和标签模型开始,查询来自 Querying a many-to-many relationship in SQLAlchemy ,我知道 session.query(Blog).join(Blog.tags).options(contains_eager(Blog.tags)).filter(Blog.tags.in_(list_of_relevant_tags)).all()将向我提供至少具有 list_of_relevant_tags 中的一个标签的所有博客文章,并且这些标签已经被查询并返回。

我看到的潜在问题(我无法对此进行测试)是我是否想获得返回博客上的标签列表。我想返回所有标签,但生成的 SQL 会建议,充其量这需要第二次查询。在最坏的情况下,SQLA 只会返回与列表匹配的标签。

有没有办法在 ORM 中提交此查询以在一次数据库命中中返回匹配的博客文章及其所有标签?

最佳答案

我想通了。不过,这感觉像是一种解决方法;必须有一种更直接的方法来使用 ORM 执行此操作。

基本上,您使用关联表的子查询(我们称它为 BlogTag,其中包含列 blog_idtag_id,它们是blogs.idtags.id)生成符合标签条件的 blog_id 列表。然后,您将该 blog_id 列表内部连接到一个未过滤的 Blog 查询,连接到 Tag 以返回相关的 Blog

t = session.query(BlogTag.blog_id).filter(BlogTag.tag_id.in_(list_of_relevant_tags)).\
group_by(BlogTag.blog_id).subquery('t')
blogs = session.query(Blog).join(Blog.tags).join(t, t.c.blog_id == Blog.id).\
options(contains_eager(Blog.tags)).all()

关于python - SQLAlchemy:过滤多对多但返回所有结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24360751/

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