在映射时配置加载策略 特定关系的加载策略可以在映射时配置,以在加载映射类型的对象的所有情况下发生,即使没有修改它的任何查询级别选项。...## 使用加载器选项进行关系加载 另一种,可能更常见的配置加载策略的方式是在针对特定属性的每个查询上设置它们,使用Select.options()方法。...populate_existing 选项将重置已经存在的所有属性,包括待处理的更改,因此在使用它之前确保所有数据都已刷新。使用带有其默认行为的Session,默认行为为自动刷新,已足够。...在映射时间配置加载策略 特定关系的加载策略可以在映射时间配置,以在加载映射类型的对象的所有情况下发生,没有任何修改它的查询级选项的情况下。...使用加载器选项加载关系 配置加载策略的另一种,可能更常见的方式是针对特定属性在每个查询上设置它们,使用 Select.options() 方法。
relationship()的默认行为是根据配置的 加载策略 完全将集合内容加载到内存中,该加载策略控制何时以及如何从数据库加载这些内容。...仅写关系 仅写加载器策略是配置relationship()的主要方法,该方法将保持可写性,但不会加载其内容到内存中。...使用WriteOnlyCollection在映射中使用"write_only"延迟加载策略与relationship()一起。有关此配置的背景,请参阅只写关系。 2.0 版本中的新功能。...WriteOnlyCollection在映射中使用"write_only"延迟加载策略与relationship()一起使用。有关此配置的背景,请参阅仅写关系。 版本 2.0 中的新功能。...使用relationship()的"write_only"延迟加载策略在映射中使用WriteOnlyCollection。有关此配置的背景,请参阅只写关系。 新版本 2.0 中新增。
这是一种在第一个 SQL 查询之后立即发出第二个 SQL 查询的加载方式,为第一个查询中的所有父级加载完整集合,使用 INNER JOIN 向上连接到父级。...在 0.6 中,该逻辑更加敏感,可以检测到所有预加载是否都表示多对一关系,如果是这种情况,预加载连接不会影响行数: SELECT * FROM addresses LEFT OUTER JOIN...这是一种在第一个 SQL 查询之后立即发出第二个 SQL 查询的加载,该查询为第一个查询中的所有父项加载完整集合,使用 INNER JOIN 向上连接到父项。...当所有三个标志都设置为默认值时,会话在回滚后能够优雅地恢复,并且很难将过时数据导入会话中。详细信息请参阅新的会话文档。 隐式排序已移除。...- ORM 的“多态加载”行为已经简化。在 0.4 版本中,mapper()有一个名为polymorphic_fetch的参数,可以配置为select或deferred。
关于使用更多或更少 SQL 访问相关项目的不同方式的背景介绍在加载策略中引入。 有关 ORM 数据操作的详细说明始于使用 ORM 进行数据操作。...ORM 映射类配置 原文:docs.sqlalchemy.org/en/20/orm/mapper_config.html ORM 配置的详细参考,不包括关系,关系详细说明在关系配置。...,这意味着它会根据底层属性(在本例中为 x 和 y)的更改来维护正确的值。...映射类行为 在使用registry对象进行所有映射样式时,以下行为是共同的: 默认构造函数 registry将默认构造函数,即__init__方法,应用于所有没有明确自己的__init__方法的映射类。...,这意味着它保持正确的值,因为底层属性(在本例中为x和y)可能会更改。
include_aliases - 如果为 True,则将规则应用于aliased()构造。 propagate_to_loaders - 默认为 True,适用于关系加载器,如延迟加载器。...property – 类绑定的属性,指示应使用哪个实例的关系来协调父/子关系。 from_entity – 要考虑为左侧的实体。默认为 Query 本身的“零”实体。...property - 类绑定属性,指示应从实例使用哪个关系来协调父/子关系。 from_entity - 要考虑为左侧的实体。这默认为 Query 本身的“零”实体。...property – 类绑定属性,表示应该使用实例中的哪种关系来协调父/子关系。 from_entity – 要考虑为左侧的实体。默认为 Query 本身的“零”实体。...property – 类绑定属性,指示应使用实例中的哪个关系来协调父/子关系。 from_entity – 要考虑为左侧的实体。默认为Query本身的“零”实体。
作为在访问时进行惰性加载的替代方法,延迟列还可以配置为在访问时引发信息异常,而不考虑它们的附加状态。...这允许映射其中某些列默认情况下不加载,并且在语句中不使用明确指令时也永远不会懒加载。有关如何配置和使用此行为的背景信息,请参阅配置映射器级别的raiseload行为一节。...column_property - 在 SQL 表达式作为映射属性一节中 应用负载、持久性和映射选项到命令式表列 - 在使用声明式配置表一节中 使用undefer()来“急切地”加载延迟列 对于默认配置为延迟加载的映射上的列...column_property - 在 SQL 表达式作为映射属性 部分 对声明性表列应用加载、持久性和映射选项 - 在使用声明性进行表配置章节中 使用undefer()来“急切地”加载延迟列 对于默认配置为延迟的映射上的列...使用默认延迟列配置的映射上的列,undefer()选项将导致通常延迟的任何列被解除延迟,即,与映射的所有其他列一起前端加载。
演示如何在“动态”关系之上放置类似字典的外观,以便字典操作(假设简单字符串键)可以在不一次加载完整集合的情况下操作大集合。...展示了如何在“动态”关系之上放置类似字典的外观,以便字典操作(假设简单字符串键)可以在一次加载完整集合的情况下操作大型集合。...演示了如何在“动态”关系之上放置类似于字典的外观,以便字典操作(假设简单的字符串键)可以在大型集合上进行操作,而无需一次加载整个集合。...已适配为在 Python 3 中运行。 在文本控制台中使用 ASCII 艺术运行。...如果返回所有分片 ID,则会查询所有分片并将结果合并在一起。 在这些示例中,针对相同的基本示例使用不同类型的分片,适应以每个大陆为基础的天气数据。
理由 此行为现在更加接近于其他种类的加载选项,如在所有 SQLAlchemy 版本中,1.3 及更早版本已经复制到查询的最顶层的关系加载器选项,如 joinedload(),在 UNION 情况下已经复制到了查询的顶层...长期以来,人们一直期待的行为是,当访问过期对象时,配置的急切加载器将运行,以便在刷新或其他情况下未过期时急切加载过期对象上的关系。...理由 这种行为现在更加接近于其他种类的加载器选项,例如所有 SQLAlchemy 版本中的关系加载器选项,如joinedload(),其中在 UNION 情况下已经复制到查询的最顶层,并且仅从 UNION...理由 这种行为现在更接近于其他类型的加载器选项,比如在所有 SQLAlchemy 版本中,1.3 版本及更早版本中的关系加载器选项joinedload(),在 UNION 情况下已经被复制到查询的最顶层...理由 这种行为现在更接近于其他种类的加载器选项,比如关系加载器选项,比如joinedload()在所有 SQLAlchemy 版本中,包括 1.3 和更早的版本,这在 UNION 情况下已经复制到查询的最顶层
SQLAlchemy 的连接和子查询急切加载在连接到相关项时在所有情况下使用别名表,因此与自引用连接兼容。...['subchild1', 'child2'] 配置自引用关系的急切加载 通过在正常查询操作期间从父表到子表使用连接或外连接来进行关系的急切加载,以便可以从单个 SQL 语句或所有直接子集合的第二个语句中填充父表及其直接子集合或引用...在下面的示例中,我们使用 User 类以及存储街道地址的 Address 类来创建一个关系 boston_addresses,它将仅加载指定城市为“波士顿”的 Address 对象: from sqlalchemy...另请参阅 邻接列表关系 - 单表版本 自引用查询策略 - 关于使用自引用映射进行查询的提示 配置自引用急切加载 - 使用自引用映射进行急切加载的提示 ## 复合“次要”连接 注意 本节介绍了...另请参阅 邻接列表关系 - 单表版本 自引用查询策略 - 使用自引用映射查询的技巧 配置自引用预加载 - 使用自引用映射预加载的技巧 复合“次要”连接 注意 本节涵盖了一些在某种程度上受
请参见 关系 WHERE 运算符在 ORM 查询指南中 ## 加载策略 在加载关系部分,我们介绍了这样一个概念,当我们使用映射对象的实例时,访问使用relationship()映射的属性时,在默认情况下...参见 关系加载技术中的两个部分: 在映射时配置加载器策略 - 配置在relationship()上的策略的详细信息 使用加载器选项进行关系加载 - 使用查询时加载策略的详细信息 Selectin...另请参阅 在 ORM 查询指南中的关系 WHERE 运算符部分 加载策略 在加载关系部分,我们介绍了一个概念,即当我们处理映射对象的实例时,默认情况下访问使用relationship()映射的属性时,如果集合未填充...下面的章节将介绍一些最常用的加载器策略。 另请参阅 关系加载技术 中的两个部分: 在映射时配置加载器策略 - 详细介绍了在 relationship() 上配置策略的方法。...使用加载器选项进行关系加载 - 详细介绍了使用查询时加载策略的方法。 Selectin Load 在现代 SQLAlchemy 中最有用的加载器是 selectinload() 加载器选项。
在默认使用模式下,必须特别小心,以避免涉及 ORM 关系和列属性的 惰性加载 或其他已过期的属性访问;下一节 在使用 AsyncSession 时防止隐式 IO 对此进行了详细说明。...在 Dynamic Relationship Loaders 中描述的“动态”关系加载器策略默认情况下不与 asyncio 方法兼容。...在默认使用模式下,必须特别小心避免涉及 ORM 关系和列属性的延迟加载或其他已过期属性访问;下一节在使用 AsyncSession 时防止隐式 IO 详细说明了这一点。...在动态关系加载器一节描述的“动态”关系加载器策略在默认情况下与 asyncio 方法不兼容。...在默认情况下,“动态”关系加载策略在动态关系加载器中描述,与 asyncio 方法不兼容。
如果有多个会话进行更改,其中任何一个会话恰巧加载了这个集合,即使是临时加载,所有会话都会尝试在它们的提交中“清理”编号,可能会导致除一个之外的所有会话都以并发修改错误失败。...API 文档 对象名称 描述 set_shard_id 一个加载器选项,用于为语句应用特定的分片 ID 到主查询,以及为其他关系和列加载器。 分片查询 与分片会话一起使用的查询类。...options(set_shard_id("shard1")) ) 上面的语句在调用时将限制为主查询的“shard1”分片标识符,以及所有关系和列加载策略,包括像selectinload()这样的急切加载器...options(set_shard_id("shard1")) ) 在上述情况下,当调用语句时,主查询以及所有关系和列加载策略,包括诸如selectinload()、延迟列加载器defer()和惰性关系加载器...提示 上述示例中的User.balance getter 访问self.acccounts集合,通常会通过配置在User.balance relationship()上的selectinload()加载策略加载
另请参阅 与 ORM 相关对象的工作 - 在 SQLAlchemy 统一教程中,提供了双向关系配置和行为的概述。...当保持默认值None时,急切加载器在遇到已经在链中较高位置的相同目标映射器时将停止链接。此选项适用于连接和子查询急切加载器。 另请参见 配置自引用急切加载 - 入门文档和示例。...noload - 任何时候都不应发生加载。相关集合将保持为空。不建议一般使用noload策略。对于一般的“永不加载”方法,请参见仅写关系。...with_expression() 关系加载技巧 关系加载风格摘要 在映射时配置加载器策略 带有加载器选项的关系加载 向加载器选项添加条件 使用 Load.options...这对于快速限制特定关系路径上连接范围的方式以及配置加载策略(如joinedload()和selectinload())非常有用。
解决此问题的一种策略是在 column_property() 函数中应用 Column 对象;虽然 Mapper 已经自动为其内部使用生成了此属性对象,但通过在类声明中命名它,类型工具将能够将属性与 Mapped...在下面的示例中,User.bio 列将不会默认加载,而只在访问时加载: from sqlalchemy.orm import deferred user_table = Table( "user...另请参阅 为命令式表列应用加载、持久化和映射选项 - 描述了与命令式表配置一起使用column_property()和deferred()的用法 显式命名声明式映射列 所有到目前为止的示例都是与 ORM...解决此问题的策略是在column_property()函数中应用Column对象;虽然Mapper已经自动生成了用于内部使用的此属性对象,通过在类声明中命名它,类型工具将能够将属性与Mapped注释匹配...、持久性和映射选项 在设置声明性映射列的加载和持久化选项一节中,我们讨论了在使用声明性表配置时如何设置加载和持久化选项。
到目前为止,当使用联接贪婪加载集合时需要调用Result.unique()有些不方便,在现代 SQLAlchemy 中,selectinload()策略提供了一个面向集合的贪婪加载器,它在大多数方面都优于...### “动态”关系加载器被“仅写”取代 概要 讨论 动态关系加载器 中讨论的 lazy="dynamic" 关系加载策略使用了在 2.0 中已经过时的 Query 对象。...在现代 SQLAlchemy 中,当使用联接预加载集合时,必须调用Result.unique()方法时,在现代 SQLAlchemy 中,selectinload()策略提供了一个集合导向的预加载器,在大多数情况下优于...### “动态”关系加载器被“仅写入”取代 简介 讨论了lazy="dynamic"关系加载策略,详见动态关系加载器,它使用了在 2.0 中已经过时的Query对象。...“动态”关系加载器被“只写”替代 简介 讨论过的 lazy="dynamic" 关系加载策略,利用了 2.0 版本中的遗留 Query 对象。
relationship() 导向属性通常会使用 select(或“延迟加载”)加载策略,如果它们在 attribute_names 集合中被明确命名,也会加载**,使用 immediate 加载策略对属性发出...要获得更开放的“刷新”功能,包括能够同时刷新许多对象的属性并明确控制关系加载策略,请使用 populate existing 功能。...Session对象的默认行为是在调用Session.rollback()或Session.commit()方法时使所有状态过期,以便为新事务加载新状态。...如果对象已经急加载,那么以relationship()为导向的属性也将立即加载,使用最初加载时的相同的急加载策略。...对于更开放的“刷新”功能,包括能够同时刷新多个对象的属性并明确控制关系加载器策略,请改用填充现有功能。 请注意,高度隔离的事务将返回与先前在该事务中读取的相同值,而不考虑该事务之外数据库状态的更改。
随着这种用例变得更加流行,它的局限性变得明显,包括非主映射器难以配置到可选择添加新列的可选项上,映射器不继承原始映射的关系,显式配置在非主映射器上的关系与加载器选项不兼容,非主映射器也没有提供可用于查询的基于列的属性的完全功能命名空间...#4365 ### FOR UPDATE 子句在联合加载子查询中以及外部呈现 此更改特别适用于使用joinedload()加载策略与行限制查询结合使用时,例如使用Query.first()或Query.limit...随着这个用例变得越来越流行,它的局限性也变得明显,包括非主要映射器难以配置以适应添加新列的可选择项,映射器不继承原始映射的关系,明确配置在非主要映射器上的关系与加载器选项不兼容,非主要映射器还不能提供可在查询中使用的基于列的属性的完全功能命名空间...随着这种使用情况越来越普遍,它的局限性变得明显,包括非主映射器难以配置到可选的添加新列的地方,映射器不继承原始映射的关系,非主映射器上明确配置的关系在加载器选项中表现不佳,非主映射器也不提供可以在查询中使用的基于列的属性的完整功能命名空间...#4365 ### FOR UPDATE 子句在联合贪婪加载子查询中以及外部呈现 此更改特别适用于使用joinedload()加载策略与行限制查询相结合,例如使用Query.first()或Query.limit
最常见的继承形式是单一和联接表,而具体继承则提出了更多的配置挑战。 当映射器配置在继承关系中时,SQLAlchemy 有能力以多态方式加载元素,这意味着单个查询可以返回多种类型的对象。...如为继承映射编写 SELECT 语句中所讨论的,任何类型的映射继承配置都可以配置为默认从特殊可选中加载,使用Mapper.with_polymorphic参数。...加载连接继承映射 请参阅编写用于继承映射的 SELECT 语句部分,了解继承加载技术的背景,包括在映射器配置时间和查询时间配置要查询的表。 单表继承 单表继承将所有子类的所有属性表示为单个表中的内容。...加载具体继承映射 具体继承的加载选项有限;一般来说,如果使用声明性具体混合类型之一在映射器上配置多态加载,那么在当前 SQLAlchemy 版本中无法在查询时修改它。...如为继承映射编写 SELECT 语句所讨论的,任何类型的映射器继承配置都可以使用Mapper.with_polymorphic参数默认配置从特殊的可选项加载。
如果为True,允许有空值,如果为False,不允许有空值 default 为这列定义默认值 SQLAlchemy 关系选项 选项名 说明 backref 在关系的另一模型中添加反向引用 primary...join 明确指定两个模型之间使用的联结条件 uselist 如果为False,不使用列表,而使用标量值 order_by 指定关系中记录的排序方式 secondary 指定多对多关系中关系表的名字...secondary join 在SQLAlchemy中无法自行决定时,指定多对多关系中的二级联结条件 数据库的基本操作 Flask-SQLAlchemy中,插入/修改/删除等操作,均有数据库会话管理....backref 为类USer申明新属性的方法 第三个参数 lazy 决定了什么时候SQLAlchemy 从数据库中加载数据 如果设置为子查询方式(subquery),则会在加载完Role对象后,就立即加载与其关联的对象...,这样会让总查询数量减少,但如果返回的条目数量很多,就会比较慢 设置为 subquery 的话,role.users 返回所有数据列表 另外,也可以设置为动态方式(dynamic),这样关联对象会在被使用的时候再进行加载
为了更有效地与此配置集成,应使用描述在使用 ORM 关系中的外键 ON DELETE 级联的附加指令。...警告 如果上述cascade="all, delete"设置在两个关系上都配置了,则级联操作将继续通过所有Parent和Child对象进行级联,加载遇到的每个children和parents集合并删除所有连接的内容...默认情况下,该功能完全独立于数据库配置的可能配置CASCADE行为的FOREIGN KEY约束。为了更有效地与此配置集成,应使用在使用 ORM 关系的外键 ON DELETE 级联中描述的附加指令。...警告 如果上述cascade="all, delete"设置在两个关系上都配置了,则级联操作将继续通过所有Parent和Child对象,加载遇到的每个children和parents集合,并删除所有连接的内容...使用 SQLAlchemy 2.0 风格的操作,这些方法在所有情况下都会影响到最外层的事务。对于Session,假定Session.autobegin保持其默认值为True。
领取专属 10元无门槛券
手把手带您无忧上云