首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在SQLAlchemy ORM中动态调整递归加载的递归深度?

在SQLAlchemy ORM中,可以通过设置relationship()函数的lazy参数来调整递归加载的递归深度。lazy参数用于指定关联对象的加载方式,常用的取值有:

  1. lazy='select':默认值,表示按需加载,即在访问关联对象时才会执行额外的查询操作。
  2. lazy='joined':表示使用JOIN操作一次性加载所有关联对象,适用于关联对象数量较少的情况。
  3. lazy='subquery':表示使用子查询一次性加载所有关联对象,适用于关联对象数量较多的情况。
  4. lazy='dynamic':表示使用动态加载,返回一个查询对象,可以在查询对象上进行进一步的过滤和排序操作。

如果需要动态调整递归加载的递归深度,可以使用backref参数来定义反向引用,并在relationship()函数中设置lazy='dynamic'。然后,通过调用查询对象的limit()方法来限制递归加载的深度。

以下是一个示例代码:

代码语言:python
代码运行次数:0
复制
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship

class Category(Base):
    __tablename__ = 'category'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    parent_id = Column(Integer, ForeignKey('category.id'))
    children = relationship('Category', backref='parent', lazy='dynamic')

# 调整递归加载的深度为2
category = session.query(Category).filter_by(name='Root').first()
category.children.limit(2).all()

在上述示例中,Category模型表示一个分类,其中包含一个自引用的关系。通过设置lazy='dynamic',可以返回一个查询对象category.children,然后通过调用limit()方法来限制递归加载的深度为2。

腾讯云提供的相关产品是TencentDB for MySQL,它是一种高性能、可扩展的云数据库服务,支持MySQL协议和SQLAlchemy ORM。您可以通过以下链接了解更多信息:

TencentDB for MySQL产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SqlAlchemy 2.0 中文文档(十九)

动态加载器已被“仅写入”集合取代,后者将阻止在任何情况下隐式加载底层集合。动态加载器在动态关系加载器中进行了讨论。...此函数是Load接口一部分,支持方法链接和独立操作。 参数: 递归深度 – 可选整数;当与自引用关系一起设置为正整数时,表示“选择加载”将自动继续到没有找到项目为止那么多级别深度。...动态加载器被“仅写入”集合取代,这将阻止在任何情况下隐式加载底层集合。动态加载器在动态关系加载讨论。...参数: recursion_depth – 递归深度 可选整数;当与自引用关系一起设置为正整数时,表示“selectin”加载将自动继续这么多级别,直到找不到任何项目为止。...keywords collection select(Order).options( lazyload(Order.items).selectinload(Item.keywords) ) 参数: 递归深度

21110

SqlAlchemy 2.0 中文文档(五十四)

ORM “eager loading”通常意味着使用连接,以便结果可以在一个结果集中加载而不是随着更多深度添加而增加查询数量(即 r + r*r2 + r*r2*r3 …) 对于更长期查询性能分析...但是,有一种情况,即如果禁用了 SQLAlchemy 新缓存系统(由于以下原因),则 ORM 性能实际上可能显着低于 1.3 或其他先前版本,原因是在 1.3 和以前版本ORM 惰性加载器和对象刷新查询没有缓存...如何在 ORM 查询中使用文本 SQL? 调用 Session.delete(myobject) 后,我对象未从父集合移除! 加载对象时为什么不调用我 __init__()?...当加载对象时,为什么我 __init__() 没有被调用? 查看跨加载保持非映射状态以了解此行为描述。 我如何在 SA ORM 中使用 ON DELETE CASCADE?...当我加载对象时,为什么我__init__()没有被调用? 有关此行为描述,请参阅 跨加载保持非映射状态。 我如何在 SA ORM 中使用 ON DELETE CASCADE?

18410
  • SqlAlchemy 2.0 中文文档(五十八)

    参考:#10124 [orm] [bug] 修复了 lazy="immediateload" 加载策略在某些情况下会将内部加载令牌放置到 ORM 映射属性问题,例如在递归自引用加载不应发生加载情况...2.0.9 发布日期:2023 年 4 月 5 日 orm [orm] [bug] 修复了当使用“关联到别名类”特性并且在加载器中指定了一个递归 eager 加载器( lazy="selectinload...,它允许单个加载器选项自动递归到自引用关系。...当检测到相关对象加载过度递归深度时,还会发出警告,该警告也会在加载器选项以任意长度连接在一起时(即,不使用新recursion_depth选项)发出。...参考:#10124 [orm] [bug] 修复了lazy="immediateload"加载策略在某些情况下会将内部加载标记放入 ORM 映射属性问题,例如在递归自引用加载不应发生加载情况

    10110

    SqlAlchemy 2.0 中文文档(七十七)

    相反,防止由于相互依赖反向引用处理程序而导致无限递归系统已经移动到了 ORM 反向引用事件处理程序,这些处理程序现在负责确保相互依赖事件链(例如向集合 A.bs 追加,响应设置多对一属性 B.a...).joinedload("entries")) 仅加载 新选项load_only()实现了“除了加载之外一切都延迟”加载方式,仅加载给定列并推迟其余部分: from sqlalchemy.orm...(Address).joinedload("entries")) 仅加载 新选项load_only()实现了“除了加载之外一切都延迟加载加载方式,仅加载给定列并推迟其余列: from sqlalchemy.orm...相反,防止由于相互依赖返回处理程序而导致无限递归系统已经移动到了 ORM 返回事件处理程序,这些处理程序现在接管了确保一系列相互依赖事件(例如向集合 A.bs 添加,响应设置多对一属性 B.a)...相反,为了防止由于相互依赖反向引用处理程序而导致无限递归,现在将这一系统移动到了 ORM 反向引用事件处理程序,这些处理程序现在负责确保一系列相互依赖事件(例如向集合 A.bs 追加,在响应设置多对一属性

    13310

    OverIQ 中文系列教程【翻译完成】

    :使用二分搜索搜索项目 C 程序:使用冒泡排序法对数组升序排序 C 程序:检查一个字符串是否是回文 C 程序:使用递归计算阶乘 C 程序:使用递归计算幂 C 程序:使用递归打印斐波那契数列 C 程序:使用递归反转数字...模板标签 Django 模板过滤器 在 Django 中加载模板 Django 模板继承 Django 模型基础 Django 迁移 Django ORM 基础第 1 部分 Django ORM...在 Flask 中提供静态文件 使用 Flask 脚本扩展 Flask Flask 表单处理 Flask Cookie Flask 会话 Flask 数据库建模 SQLAlchemy...ORM 基础 将 Alembic 用于数据库迁移 在 Flask 中发送电子邮件 Flask 认证 Flask 应用结构和蓝图 SQLAlchemy 教程 SqlAlchemy 简介 安装...SQLAlchemy 并连接到数据库 在 SQLAlchemy 核心中定义模式 使用 SQLAlchemy 核心 CRUD 在 SQLAlchemy ORM 定义模式 使用 SQLAlchemy ORM

    1.5K20

    SqlAlchemy 2.0 中文文档(三十一)

    1.4 版本更改:绝大部分声明式扩展现在已整合到 SQLAlchemy ORM ,并可从 sqlalchemy.orm 命名空间导入。请参阅声明式映射文档以获取新文档。...可以使用 pip 使用“mypy”额外钩子安装 Mypy: pip install sqlalchemy[mypy] 插件本身 Configuring mypy to use Plugins 描述那样配置...这再次与 SQLAlchemy ORM 实际创建构造函数时行为相匹配,不应与验证系统( Python dataclasses)行为混淆,后者将根据注释生成与可选与必需属性相匹配构造函数。...对于前者,它在属性设置操作和 ORM 加载操作期间都会被调用。对于后者,它仅在属性设置操作期间被调用;composite()构造机制在加载操作期间处理强制转换。...对于MutableComposite,MutableBase.coerce()方法仅在属性设置操作调用,而不是在加载操作调用。

    30220

    FastAPI从入门到实战(2)——Pydantic模型

    使用Python类型提示来进行数据校验和settings管理; 可以在代码运行时候提供类型提示,数据校验失败时候提供友好错误提示; 定义数据应该如何在纯规范Python代码中保存...str = "MinChess" #有默认值,选填字段 signup_ts: Optional[datetime] = None friends: List[int] = [] # 列表元素需要是...简单说,ORM 将数据库表与面向对象语言中类建立了一种对应关系。..." #有默认值,选填字段 signup_ts: Optional[datetime] = None friends: List[int] = [] # 列表元素需要是int类型或者能转换为...__fields__.keys()) # (这里查看所有字段)定义模型类时候,所有字段都注明类型,字段顺序就不会乱 print("====="*6,'递归模型','====='*6) class

    1.7K20

    SqlAlchemy 2.0 中文文档(三)

    另请参见 delete - 描述了如何调整 Session.delete() 行为,以便处理其他表相关行应该如何处理。...另请参阅 ORM-启用 INSERT、UPDATE 和 DELETE 语句 - 在 ORM 查询指南中 回滚 Session有一个Session.rollback()方法,预期般在进行 SQL...还有一个针对 address 表 SELECT,这是因为 ORM 在该表查找可能与目标行相关行;这种行为是作为 级联 行为一部分,并且可以通过允许数据库自动处理 address 相关行来更高效地进行调整...另请参阅 delete - 描述了如何调整 Session.delete() 行为,以便处理其他表相关行方式。...另请参见 ORM 启用 INSERT、UPDATE 和 DELETE 语句 - 在 ORM 查询指南中 回滚 Session有一个 Session.rollback() 方法,预期那样,在进行

    31820

    SQLAlchemy学习-10. validates()校验器

    Integer, String, ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.orm import validates...backref 链接情况include_backrefs=False;此选项设置为 False,如果事件是由于反向引用而发生,则防止发出验证函数: from sqlalchemy.orm import...需要对属性更改行为配置进行更多控制应用程序可以使用此系统,AttributeEvents. 对象名称 描述 验证(names, *kw) 将方法装饰为一个或多个命名属性“验证器”。...将方法装饰为一个或多个命名属性“验证器”。 将方法指定为验证器,该方法接收属性名称以及要分配值,或者在集合情况下,将值添加到集合。...请注意,集合验证器不能在验证例程中发出该集合负载 - 这种用法会引发断言以避免递归溢出。这是不支持可重入条件。 参数: *names  - 要验证属性名称列表。

    80610

    SqlAlchemy 2.0 中文文档(四)

    请参阅下一节在加载时保持非映射状态了解如何在加载对象时调用特殊逻辑基础知识。 包含显式__init__()方法类将保留该方法,并且不会应用默认构造函数。...警告 类__init__()方法仅在 Python 代码构造对象时调用,而不是在从数据库加载或刷新对象时调用。请参阅下一节在加载过程中保持非映射状态,了解如何在加载对象时调用特殊逻辑入门知识。...使用 Python 描述符( @property),而不是状态,根据需要动态计算属性。 对于简单属性,这是最简单且最不容易出错方法。...警告 当对象在 Python 代码构造时才调用类 __init__() 方法,而不是在从数据库加载或刷新对象时。请参阅下一节在加载时保持非映射状态,了解如何在加载对象时调用特殊逻辑基本知识。...使用 Python 描述符,@property,而不是状态,根据需要动态计算属性。 对于简单属性,这是最简单且最少错误方法。

    19910

    SqlAlchemy 2.0 中文文档(十三)

    下次 flush 时,给定项目将从父实例集合移除。 class sqlalchemy.orm.DynamicMapped 表示“动态”关系 ORM 映射属性类型。...另请参阅 动态关系加载器 - 完整背景 WriteOnlyMapped - 完全 2.0 版本风格 类签名 类 sqlalchemy.orm.DynamicMapped (sqlalchemy.orm.base...给定项目将在下一个 flush 时从父实例集合移除。 class sqlalchemy.orm.DynamicMapped 代表“动态”关系 ORM 映射属性类型。...给定项目将在下一次刷新时从父实例集合移除。 class sqlalchemy.orm.DynamicMapped 代表“动态”关系 ORM 映射属性类型。...另请参阅 动态关系加载器 - 完整背景 WriteOnlyMapped - 完全符合 2.0 风格版本 类签名 类 sqlalchemy.orm.DynamicMapped (sqlalchemy.orm.base

    14410

    SqlAlchemy 2.0 中文文档(三十三)

    : directed_graph.py ### 作为字典动态关系 演示如何在动态”关系之上放置类似字典外观,以便字典操作(假设简单字符串键)可以在不一次加载完整集合情况下操作大集合。...) 文件清单: directed_graph.py ### 动态关系作为字典 展示了如何在动态”关系之上放置类似字典外观,以便字典操作(假设简单字符串键)可以在一次加载完整集合情况下操作大型集合。...: directed_graph.py 动态关系作为字典 演示了如何在动态”关系之上放置类似于字典外观,以便字典操作(假设简单字符串键)可以在大型集合上进行操作,而无需一次加载整个集合。...Dogpile 缓存 说明如何在 ORM 查询嵌入dogpile.cache功能,允许完全缓存控制,以及从长期缓存拉取“惰性加载”属性能力。...### Dogpile 缓存 说明如何在 ORM 查询嵌入[dogpile.cache](https://dogpilecache.sqlalchemy.org/)功能,允许完全缓存控制,以及从长期缓存拉取

    25410

    SqlAlchemy 2.0 中文文档(五十六)

    ### “动态”关系加载器被“仅写”取代 概要 讨论 动态关系加载讨论 lazy="dynamic" 关系加载策略使用了在 2.0 已经过时 Query 对象。...### “动态”关系加载器被“仅写入”取代 简介 讨论了lazy="dynamic"关系加载策略,详见动态关系加载器,它使用了在 2.0 已经过时Query对象。...我们可以立即使用动态加载器进行方法,Session.scalars(),如下所示: class User(Base): __tablename__ = "user" posts =...新方法利用了aliased()构造,因此 ORM 内部无需猜测应该如何调整哪些实体和列,以及以何种方式进行调整;在上面的示例,ua和aa对象都是AliasedClass实例,为内部提供了一个明确标记...“动态”关系加载器被“只写”替代 简介 讨论过 lazy="dynamic" 关系加载策略,利用了 2.0 版本遗留 Query 对象。

    33710

    SqlAlchemy 2.0 中文文档(十八)

    这里一般原理是性能,在表具有很少使用列,并且具有潜在大数据值,因为在每次查询时完全加载这些列可能会耗费时间和/或内存。当实体加载时,SQLAlchemy ORM 提供了各种控制列加载方式。...应该捕获在视图层内部发出任何进一步 SQL 操作,以便可以调整预先加载操作以适应该额外数据,而不是产生额外惰性加载。...ORM 然后将其视为一个特殊加载选项,动态应用于语句。...ORM 然后将其视为一个特殊加载选项,该选项动态应用于语句。...with_expression() 作为对象加载选项,只对查询最外层部分生效,并且仅适用于对完整实体进行查询,而不适用于子查询任意列选择或复合语句( UNION)元素。

    20210

    SqlAlchemy 2.0 中文文档(二十)

    另请参阅 ORM 实体别名 - 在 SQLAlchemy 统一教程 选择 ORM 别名 - 在 ORM 查询指南 参数: element – 要别名化元素。...propagate_to_loaders - 默认为 True,适用于关系加载器,延迟加载器。这表示选项对象本身包括 SQL 表达式随每个加载实例一起传递。...另请参阅 ORM 实体别名 - 在 SQLAlchemy 统一教程 选择 ORM 别名 - 在 ORM 查询指南 参数: element – 要别名元素。...结果对象是 AliasedClass 一个实例。此对象实现了与原始映射类相同属性和方法接口,允许 AliasedClass 兼容任何在原始类上工作属性技术,包括混合属性(参见混合属性)。...propagate_to_loaders – 默认为 True,适用于关系加载器,惰性加载器。这表示选项对象本身,包括 SQL 表达式,将随每个加载实例一起传递。

    19010
    领券