当前位置: 首页 > 面试题库 >

SQLAlchemy Joinedload过滤器列

子车才捷
2023-03-14
问题内容

嗨,我想使用joinedload对查询进行过滤。但是我似乎无法使其正常工作。以下是我的示例查询

result = (
        session.query(Work).
        options(
            joinedload(Work.company_users).
            joinedload(CompanyUser.user)
        ).
        filter(Work.id == 1).
        filter(User.first_name == 'The name').  <<--- I can't get this to work.
        all()
    )

运行此命令时,它返回的行超出了我的期望。实际结果应仅返回8行。但是执行此查询后,它返回234行,这比我预期的要多


问题答案:

它不起作用的原因是joinedload(以及所有其他关系加载技术)是完全透明的。也就是说,joinedload在查询中包含a不会导致填充关系,而不会以任何其他方式影响它。您应该阅读“加入渴望的禅宗”,其开头为:

由于急切的联合加载似乎与的使用非常相似Query.join(),因此经常混淆应何时使用以及如何使用它。了解区别的关键在于,尽管该区别Query.join()用于更改查询的结果,但joinedload()要花很长时间不更改查询的结果,而是隐藏呈现的联接的效果,以仅允许存在相关对象。

技巧之一是对无法使用的联接表使用别名。然后,您的查询最终在Work和User之间执行隐式交叉联接,从而在多余的行之间进行隐式交叉联接。因此,为了根据联接的表进行过滤,请使用Query.join()

session.query(Work).\
    join(Work.company_users).\
    join(CompanyUser.user).\
    filter(Work.id == 1).\
    filter(User.first_name == 'The name').\
    all()

并且如果还需要适当的预加载,则可以使用以下命令指示查询已包含联接contains_eager()

session.query(Work).\
    join(Work.company_users).\
    join(CompanyUser.user).\
    options(contains_eager(Work.company_users).
            contains_eager(CompanyUser.user)).\
    filter(Work.id == 1).\
    filter(User.first_name == 'The name').\
    all()

请注意对的链接调用contains_eager()



 类似资料:
  • 过滤器是 控制器动作 执行之前或之后执行的对象。 例如访问控制过滤器可在动作执行之前来控制特殊终端用户是否有权限执行动作, 内容压缩过滤器可在动作执行之后发给终端用户之前压缩响应内容。 过滤器可包含预过滤(过滤逻辑在动作之前)或后过滤(过滤逻辑在动作之后), 也可同时包含两者。 使用过滤器 过滤器本质上是一类特殊的 行为, 所以使用过滤器和 使用行为一样。 可以在控制器类中覆盖它的 behavio

  • 请你再一次回顾这张图: 一个 HTTP 请求,过滤器是第一组被执行的对象。同适配器不同的是,一个请求中,可以执行多个过滤器。 如何使用过滤器? 通过 @Filters 注解。 注解 '@Filters' 的值是一个 '@By' 注解的数组,它可以声明在这三个地方 入口函数 子模块 主模块 其中入口函数的 @Filters 优先级更高,其次是子模块,最后是主模块。 就是说,你在入口模块声明了两个过滤

  • 过滤器前缀 :, 比如 :markdown 会把下面块里的文本交给专门的函数进行处理。查看顶部 特性 里有哪些可用的过滤器。 body :markdown Woah! jade _and_ markdown, very **cool** we can even link to [stuff](http://google.com) 渲染为: <body><p>Woah! j

  • 过滤器本质上是可以应用于变量的函数。它们用管道操作符(|)调用,并且可以接受参数。 {{ foo | title }} {{ foo | join(",") }} {{ foo | replace("foo", "bar") | capitalize }} 定义一个新的过滤器 可以在过滤器的入口自定义函数来扩展过滤器。 过滤器函数将要过滤的内容作为第一个参数,并应返回新内容。 参考上下文API了

  • Filters are special post-processors that modify expanded abbreviation right before output to the editor. To better understand how filters work, let’s walk through a simple tutorial. 过滤器在输出发给编辑器之前修改缩写的

  • 我正试图在我的RecyclerView中实现搜索过滤器,就像在这篇文章中一样 我已经对它进行了调试,它确实按照预期过滤了项目,但列表在应用程序中似乎没有改变。一、 E:我过滤一个名字,有7个结果,在屏幕上是原始列表。 我的 onCreateMenu活动选项是: 我的适配器如下所示: 我忘了什么? 提前致谢!

  • 问题内容: “过滤后的查询和过滤器”与“根查询和过滤器”之间有什么区别吗?例如 情况1: 情况2: 我在http://elasticsearch-users.115913.n3.nabble.com/Filtered-query-vs-using- filter-outside-td3960119.html中 找到了此讨论,但所引用的URL是404,并且解释过于简洁我。 请示教或提供指出这些区别的

  • 问题内容: 您如何从Java ArrayList中过滤掉某些内容,例如: 你好吗 你好吗 乔 麦克风 过滤条件是“如何”,它将删除Joe和Mike。 问题答案: 最好的方法可能是使用番石榴 版画 如果您希望将过滤后的集合作为列表获取,则可以使用此列表(也可以从Guava中使用):