过滤SQLAlchemy查询结果对象的一对多属性

2023-11-23

假设我有几个对象,具有一对多的关系,例如

class Parent():
    //id, other cols, etc
    children = relationship("Child", backref="parent")

class Child():
    parent_id = Column(Integer, ForeignKey("parent.id")
    child_type = Column(Enum("a","b"))

现在,我想查询 Parent 对象,但让他们的孩子按 child_type 过滤,即类似

session.query(Parent).join(Parent.children).filter(Child.child_type == "a")

这只是返回父级和所有子级,基本上忽略了过滤器。这个结果是否可能,或者我是否还必须查询 Child?


事实上,您的查询添加了联接和过滤器,但仅返回Parent实例。实际上,only those Parent至少有一个实例Child类型的a.
当您随后访问.children在每个父级上,将发出一个新的 SQL 语句,并且all该父级的子级将被加载。您可以在内存中再次应用过滤器,或者创建自己的查询而不依赖于关系导航(已注释掉),如下所示:

# select *only* those parents who have at least one child of type "a"
parents = session.query(Parent).join(Parent.children).filter(Child.child_type == "a")
for p in parents:
    # 1. in-memory filter: now select only type "a" children for each parent
    children_a = [c for c in p.children if c.child_type == 'a']
    # 2. custom query: now select only type "a" children for each parent
    # children_a = session.query(Child).with_parent(p).filter(Child.child_type == "a")

    print("AAA", p)
    for c in children_a:
        print("AAA ..", c)

下面显示了在一个查询中执行此操作的一种方法,但要小心,因为您实际上是在告诉 sqlalchemy 您已加载all孩子为父母。您可以在执行查询然后丢弃/回收会话的情况下使用此方法:

# select all parents, and eager-load children of type "a"
parents = (session.query(Parent)
        .join(Parent.children).filter(Child.child_type == "a")
        # make SA think we loaded all *parent.children* collection
        .options(contains_eager('children'))
        )

for p in parents:
    children_a = p.children # now *children* are *incorrectly* filtered
    print("BBB", p)
    for c in children_a:
        print("BBB ..", c)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

过滤SQLAlchemy查询结果对象的一对多属性 的相关文章

随机推荐

  • 如何将数据从一个数据库/表复制到另一个数据库/表

    我使用以下文档编写了以下查询 Oracle 文档将一些数据从生产服务器上的数据库 表复制到沙箱服务器上的数据库 表 COPY FROM username1 passwd1
  • 当数据经过 URL 编码时,HTTP GET 的安全性如何?

    如果数据是 Url 编码的 是否足够安全 可以通过 HTTP GET 发送登录凭据 一点也不 URL 编码很容易逆转 您应该加密传输层 即使用 HTTPS
  • 如何通过 Flask 应用程序传输数据?

    我正在研究使用 Flask 应用程序作为嵌入式系统接口的可能性 我以前使用过 Flask 例如 我编写了一些非常基本的 Flask 站点来轮询外部系统 以响应页面加载以填充图表 但我不确定如何将数据推送到 Flask 应用程序中并连接到用户
  • 将内联格式添加到使用消息的便捷方法

    Usage Messages的内置函数嵌入了内联格式 例如 In 1 ActionMenu usage FullForm Out 1 FullForm RowBox ActionMenu RowBox StyleBox name TI Ro
  • 如何将侦听器添加到使用 CheckBoxListCell 的列表视图内的复选框

    I have a listview that uses a CheckBoxListCell to display a list with checkboxes next to the items How do I add a listen
  • 空感知函数调用运算符

    以同样的方式我们可以有 nullableClassInstance method blah 有办法吗 nullableFunctionInstance blah 换句话说 是否存在一个运算符来检查函数实例是否不存在null 如果是这样 请在
  • 地址运算符 (&) 与引用运算符 (&)

    我对这个案例有点困惑 声明一个指针 int b 10 int a b 这里 取 b 的地址 考虑另一个例子 Reference to the calling object can be returned Test Test func Som
  • 长时间处于浮动状态,为什么?

    long b 99 float c 99 0F b c Error Cannot implicitly convert type float to long c b Running Successfully Why 为什么数据类型的大小和隐
  • 在php中正确使用其他类中的类?

    很久以前就应该问别人这个问题了 在另一个类中使用其他类的最佳方法是什么 例如 假设我有一个应用程序类 class Application public function displayVar echo hello world 和一个数据库类
  • 如何匹配 pandas DataFrame 中的多个列以获得“间隔”?

    我有以下熊猫数据框 import pandas as pd df pd DataFrame filename csv print df order start end value 1 1342 1357 category1 1 1459 1
  • 删除列表列中重复的列表元素

    这是我的数据框 pd DataFrame A 1 3 3 4 5 3 3 B 0 2 3 4 5 6 7 C 1 4 4 4 1 4 4 4 3 4 4 5 3 4 4 5 4 4 2 1 1 2 3 4 7 8 9 1 我想要设置 删除每
  • iPhone 应用程序中出现“服务器证书不受信任”错误

    我在用我的 iPhone 应用程序在我的 iPhone 3G OS 3 0 1 上没有任何问题 应用程序连接到 API URL https api server密度 com 1 0 所有请求都会经过它 该应用程序的用户报告说 他们现在突然收
  • 使用 Lucene 增强新文档

    Lucene 是否提供了增强新文档的方法 例如 假设 Lucene 文档包含一个日期字段 是否有可能在用户不改变其查询的情况下 以更高的分数呈现最新的文档 我不想诉诸粗略的 按日期排序 解决方案 因为它将完全取消评分算法 您可以看到 Luc
  • 使用向负无穷大截断与向零截断的优点

    我想知道使用负无穷大截断有哪些好处 Haskell从编程语言 编译器实现的角度来看 Ruby Ruby 而不是向零截断 C PHP 似乎向负无穷大截断是正确的方法 但我还没有找到这种说法的可靠来源 也没有找到这种决定如何影响编译器的实现 我
  • 在手动引导之前使用角度服务

    我想在进行手动引导之前使用角度服务 未使用 ng app 指令 有没有一种方法可以访问角度服务而无需在空 div 上调用 angular bootstrap 以下方法有效 但我想知道是否有更直接的解决方案 var element angul
  • 在 JSP 中使用 if-else

    我使用以下代码在浏览器上打印用户名
  • 是否可以测试 IBAction?

    对 IBOutlet 进行单元测试相当容易 但是 IBActions 怎么样 我试图找到一种方法来做到这一点 但没有运气 有没有办法对视图控制器中的 IBAction 和 nib 文件中的按钮之间的连接进行单元测试 对于完整的单元测试 每个
  • 访问部署在tomcat中的SoapUI Mock Service中的文件资源

    问题简而言之 访问本地file in 脚本调度程序关于项目路径 即def file new File groovyUtils projectPath responseFileName xml 这是工作正常当测试运行时SoapUI as 模拟
  • Python 模拟远程 tail -f?

    我们有几个应用程序服务器和一个中央监控服务器 我们当前正在从监控服务器运行带有 tail f 的 ssh 以从应用程序服务器实时传输多个文本日志文件 除了整个方法的脆弱性之外 问题还在于终止 ssh 进程有时会留下僵尸尾进程 我们已经尝试使
  • 过滤SQLAlchemy查询结果对象的一对多属性

    假设我有几个对象 具有一对多的关系 例如 class Parent id other cols etc children relationship Child backref parent class Child parent id Col