将 contains_eager 与过滤器一起使用,但不过滤掉没有匹配子代的父代[重复]

2024-04-06

阅读 SQLAlchemy 文档:

http://docs.sqlalchemy.org/en/latest/orm/loading_relationships.html#using-contains-eager-to-load-a-custom-filtered-collection-result http://docs.sqlalchemy.org/en/latest/orm/loading_relationships.html#using-contains-eager-to-load-a-custom-filtered-collection-result

上面的查询将仅加载至少包含其电子邮件字段中包含子字符串“ed”的地址对象的用户对象。

我正在尝试做类似的事情,但我也想检索根本没有匹配地址的所有 User 对象。

为了更好地解释自己,我修改了这段代码,这是 SQLAlchemy 文档中的示例之一:

from sqlalchemy.ext.declarative import as_declarative, declared_attr
from sqlalchemy import create_engine, Integer, Column, \
                    String, and_ 
from sqlalchemy.orm import Session, relationship, foreign, remote, backref, joinedload, contains_eager
from sqlalchemy import event


@as_declarative()
class Base(object):
    """Base class which provides automated table name
    and surrogate primary key column.

    """
    @declared_attr
    def __tablename__(cls):
        return cls.__name__.lower()
    id = Column(Integer, primary_key=True)

class Address(Base):
    """The Address class.

    This represents all address records in a
    single table.

    """
    street = Column(String)
    city = Column(String)
    zip = Column(String)

    discriminator = Column(String)
    """Refers to the type of parent."""

    parent_id = Column(Integer)
    """Refers to the primary key of the parent.

    This could refer to any table.
    """

    @property
    def parent(self):
        """Provides in-Python access to the "parent" by choosing
        the appropriate relationship.

        """
        return getattr(self, "parent_%s" % self.discriminator)

    def __repr__(self):
        return "%s(street=%r, city=%r, zip=%r)" % \
            (self.__class__.__name__, self.street,
            self.city, self.zip)

class HasAddresses(object):
    """HasAddresses mixin, creates a relationship to
    the address_association table for each parent.

    """

@event.listens_for(HasAddresses, "mapper_configured", propagate=True)
def setup_listener(mapper, class_):
    name = class_.__name__
    discriminator = name.lower()
    class_.addresses = relationship(Address,
                        primaryjoin=and_(
                                        class_.id == foreign(remote(Address.parent_id)),
                                        Address.discriminator == discriminator
                                    ),
                        backref=backref(
                                "parent_%s" % discriminator,
                                primaryjoin=remote(class_.id) == foreign(Address.parent_id)
                                )
                        )
    @event.listens_for(class_.addresses, "append")
    def append_address(target, value, initiator):
        value.discriminator = discriminator

class Customer(HasAddresses, Base):
    name = Column(String)

class Supplier(HasAddresses, Base):
    company_name = Column(String)

engine = create_engine('sqlite://', echo=True)
Base.metadata.create_all(engine)

session = Session(engine)

session.add_all([
    Customer(
        name='customer 1',
        addresses=[
            Address(
                    street='123 anywhere street',
                    city="New York",
                    zip="10110"),
            Address(
                    street='40 main street',
                    city="San Francisco",
                    zip="95732")
        ]
    ),
    Customer(
        name='customer 2',
        addresses=[
            Address(
                    street='88 hello yes',
                    city="Old Potato",
                    zip="10110"),
            Address(
                    street='123 banana street',
                    city="New Texas",
                    zip="23422"),
            Address(
                    street='40 dsfasadfmain street',
                    city="San Cocisfran",
                    zip="10110")
        ]
    ),
    Customer(
        name='customer 3',
        addresses=[
            Address(
                    street='123 orange street',
                    city="New Mew",
                    zip="23422"),
        ]
    ),
    Supplier(
        company_name="Ace Hammers",
        addresses=[
            Address(
                    street='2569 west elm',
                    city="Detroit",
                    zip="56785")
        ]
    ),
])

session.commit()

query = (
    session.query(Customer)
    .outerjoin(Customer.addresses)
    .filter(Address.zip == "10110")
    .options(contains_eager(Customer.addresses))
)
for customer in query.all():
    print(customer.name)
    print(str(customer.addresses))

此代码正确打印了客户 1 和 2 及其邮政编码为 10110 的地址,但我也想获取客户 3,即使它根本没有匹配的地址。

即:我想要获取所有客户的列表,无论他们的地址是什么,并且对于每个客户,我希望填充他们的地址,但前提是他们的邮政编码为 10110。

理想情况下,这将显示为 JOIN 的附加条件,而不是 WHERE。结果查询可能看起来像这样,我只是不知道如何用 SQLAlchemy 术语“表达”它:

... LEFT OUTER JOIN address ON customer.id = address.parent_id AND address.discriminator = 'customer' AND address.zip = '10110'


您可以更改连接条件:

query = session.query(Customer) \
               .outerjoin(Address, and_(Address.parent_id == Customer.id,
                                        Address.discriminator == "customer",
                                        Address.zip == "10110")) \
               .options(contains_eager(Customer.addresses))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 contains_eager 与过滤器一起使用,但不过滤掉没有匹配子代的父代[重复] 的相关文章

  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • 如何手动计算分类交叉熵?

    当我手动计算二元交叉熵时 我应用 sigmoid 来获取概率 然后使用交叉熵公式并平均结果 logits tf constant 1 1 0 1 2 labels tf constant 0 0 1 1 1 probs tf nn sigm
  • 使用 python requests 模块时出现 HTTP 503 错误

    我正在尝试发出 HTTP 请求 但当前可以从 Firefox 浏览器访问的网站响应 503 错误 代码本身非常简单 在网上搜索一番后我添加了user Agent请求参数 但也没有帮助 有人能解释一下如何消除这个 503 错误吗 顺便说一句
  • Python getstatusoutput 替换不返回完整输出

    我发现了这个很棒的替代品getstatusoutput Python 2 中的函数在 Unix 和 Windows 上同样有效 不过我觉得这个方法有问题output被构建 它只返回输出的最后一行 但我不明白为什么 任何帮助都是极好的 def
  • 使用 Python 从文本中删除非英语单词

    我正在 python 上进行数据清理练习 我正在清理的文本包含我想删除的意大利语单词 我一直在网上搜索是否可以使用像 nltk 这样的工具包在 Python 上执行此操作 例如给出一些文本 Io andiamo to the beach w
  • 您可以格式化 pandas 整数以进行显示,例如浮点数的“pd.options.display.float_format”?

    我见过this https stackoverflow com questions 18404946 py pandas formatdataframe and this https stackoverflow com questions
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • Pandas Merge (pd.merge) 如何设置索引和连接

    我有两个 pandas 数据框 dfLeft 和 dfRight 以日期作为索引 dfLeft cusip factorL date 2012 01 03 XXXX 4 5 2012 01 03 YYYY 6 2 2012 01 04 XX
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • Docker 中的 Python 日志记录

    我正在 Ubuntu Web 服务器上的 Docker 容器中测试运行 python 脚本 我正在尝试查找由 Python Logger 模块生成的日志文件 下面是我的Python脚本 import time import logging
  • 仅第一个加载的 Django 站点有效

    我最近向 stackoverflow 提交了一个问题 标题为使用mod wsgi在apache上多次请求后Django无限加载 https stackoverflow com questions 71705909 django infini
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • 如何在 Windows 命令行中使用参数运行 Python 脚本

    这是我的蟒蛇hello py script def hello a b print hello and that s your sum sum a b print sum import sys if name main hello sys
  • python import inside函数隐藏现有变量

    我在我正在处理的多子模块项目中遇到了一个奇怪的 UnboundLocalError 分配之前引用的局部变量 问题 并将其精简为这个片段 使用标准库中的日志记录模块 import logging def foo logging info fo
  • Python ImportError:无法导入名称 __init__.py

    我收到此错误 ImportError cannot import name life table from cdc life tables C Users tony OneDrive Documents Retirement retirem
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • 如何应用一个函数 n 次? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 假设我有一个函数 它接受一个参数并返回相同类型的结果 def increment x return x 1 如何制作高阶函数repeat可以
  • 如何计算Python中字典中最常见的前10个值

    我对 python 和一般编程都很陌生 所以请友善 我正在尝试分析包含音乐信息的 csv 文件并返回最常听的前 n 个乐队 从下面的代码中 每听一首歌曲都是一个列表中的字典条目 格式如下 album Exile on Main Street
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • 更改 Tk 标签小部件中单个单词的颜色

    我想更改 Tkinter 标签小部件中单个单词的字体颜色 我知道可以使用文本小部件来实现与我想要完成的类似的事情 例如使单词 YELLOW 显示为黄色 self text tag config tag yel fg clr yellow s

随机推荐

  • 将两个具有不同数据点的散点图组合起来

    我有一个要求 我想在同一绘图区域中组合两个不同的散点图 一个散点图使用指标 1 另一张散点图使用指标 2 在R中可行吗 我已经添加了数据集和代码 但不知道如何将这两个合并在同一个图中 df1 lt data frame Product c
  • 在 Centos7 上使用 SQLite3 与 Django 2.2 和 Python 3.6.7

    我正在将 Django 代码从 2 1 7 直接移至新的 Django 2 2 我在 Centos7 开发环境中遇到的唯一问题是我的本地开发数据库 sqlite3 版本与我的 Python 3 6 7 不兼容 我从 manage py ru
  • 在此范围内未声明“GL_CLAMP_TO_EDGE”

    我该如何解决 我已经包含了 gl gl h 和 gl glu h 那么有什么作用呢 它是 OpenGL 1 2 的一部分 这就是为什么它不在 Microsoft 的 OpenGL 1 1 标头中 将此行添加到您的代码中的某个位置 顺便说一句
  • 具有多个视图集的 Django Rest Framework 路由器

    我正在尝试使用 DRF 3 1 创建 API 我首先使用 ModelViewSet 创建管理函数 并将它们注册到 DefaultRouter 这工作得很好 默认的 API 根视图在浏览器中查看时会生成适当的链接 然后 我使用 ReadOnl
  • 选择 pandas 数据框中所有零条目的列

    给定一个数据框df 如何找出所有只有0作为值的列 0 1 2 3 4 5 6 7 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 1 1 1 预期产出 2 4 0 0 0 1 0 0 我只需将这些值与 0 进行比较并使用 all
  • 选择要显示的随机图像

    我有一个包含 4 张图像的页面 我希望每次查看页面时都从图像选择中随机选择这些图像 图像还需要链接到特定页面 取决于显示的图像 例如 image 01 page 620 html image 04 page 154 html HTML di
  • 动态加载模块的租户特定路由

    我正在使用 ASP NET MVC 开发应用程序框架 本质上 最终目标是能够登录管理界面 创建具有自定义设置的新租户 启用他们想要的模块 博客 购物篮等 工作完成 客户对新网站感到满意 我没有使用单独的应用程序 因为会有很多共享代码 这样维
  • 当文件没有扩展名时,如何告诉 RubyMine 文件类型?

    这看起来应该很容易 我正在创建一个 CLI 命令 gem 所以命令位于bin gem name其中没有 rb扩大 当我尝试在 RubyMine 中编辑该文件时 它没有为其提供语言模式 抱歉 不知道正确的术语 来使语法突出显示和 RubyMi
  • 如何使用现有的 Display 特征实现来实现 Serialize?

    我希望实施Serialize外部板条箱中类型的特征 但这是禁止的 我看了 serde 的远程导出 https serde rs remote derive html 但重写类型似乎需要做很多工作 就我而言 我希望序列化的所有类型都实现了Di
  • JavaScript 中的简单金融利率函数

    我正在寻找一个简单的 javascript 金融 RATE 函数 我找到了这个 但似乎太难理解了 我想简化这个功能 需要你的帮助 如果有人有最简单的功能 请回答 这是一个等效的 Excel RATE 函数 var rate function
  • 使用 .htaccess 阻止对文件和子目录的访问?

    我的目录中有近30个php文件 4个子目录 我想阻止用户直接查看一些 php 文件和子目录 例如http bhavani com hai php 我现在的htaccess file Enable Mod Rewrite this is on
  • Node.js HTTP 请求返回 2 个块(数据体)

    我试图通过 node js 中的 HTTP 请求获取 HTML 文件的源 我的问题是它返回数据两次 这是我的代码 var req http request options function res res setEncoding utf8
  • EUID 和 UID 之间的区别?

    EUID不等于UID 脚本中这两者在什么上下文中使用 我试图通过以下方式获取值echo UID is UID and EUID is EUID 但只有空间作为输出 我的机器运行 Ubuntu 12 04 LTS 在一些网站上看到 这通常用于
  • 在 Android 设备上使用 HTTP Post 将数据放入 Google App Engine Blobstore

    我正在尝试将数据发布到谷歌应用程序引擎上的Blob Store 此代码运行时不会抛出任何异常 但在blobstore端根本没有关于发布请求的日志 当我使用表单 尽管带有 mime 数据 发布时 服务器端的东西就可以工作 我已经允许我的 An
  • Laravel:错误 [PDOException]:无法在 MySQL 中找到驱动程序

    我正在尝试在我的中保存一个寄存器MySQL数据库使用Eloquent of Laravel 5 我编辑了数据库信息 env文件 本地化在我的系统根路径中 并在config database php维持 default gt mysql 和其
  • javascript排序稀疏数组保留索引

    对稀疏数组进行排序并使元素保持相同索引的最佳方法是什么 例如 a 0 3 a 1 2 a 2 6 a 7 4 a 8 5 我想排序后有 a 0 2 a 1 3 a 2 4 a 7 5 a 8 6 这是一种方法 它将定义的数组元素复制到新数组
  • 从 methodInfo.invoke 获取返回值

    我如何获得返回值 int from a methodInfo invoke 让我感到困难的是我使用字符串变量来调用该方法 检查下面的示例 if Convert ToBoolean getParameterFromXML issue k 1
  • 推送通知设备令牌?

    如何从我的 iPhone 设备获取设备令牌 此方法将在调试模式下在控制台中打印 deviceToken 如果您想查看设备令牌 也可以在 UIAlert 中看到 void application UIApplication applicati
  • Response.ContentType application/vnd.ms-excel xls 停止工作

    我对这个问题做了一些相当深入的搜索 但没有运气 在过去的几天里 从 HTML 到 XLS 的输出似乎已停止在我支持的许多旧版 阅读 经典 ASP 系统上运行 我已经能够在多个服务器 从 Office 2010 到 Office 2016 的
  • 将 contains_eager 与过滤器一起使用,但不过滤掉没有匹配子代的父代[重复]

    这个问题在这里已经有答案了 阅读 SQLAlchemy 文档 http docs sqlalchemy org en latest orm loading relationships html using contains eager to