作为在访问时进行惰性加载的替代方法,延迟列还可以配置为在访问时引发信息异常,而不考虑它们的附加状态。...with_expression() 作为对象加载选项,仅对查询的最外层部分以及对完整实体的查询起作用,而不适用于任意列选择、子查询或复合语句的元素,比如 UNION。...如果在 select() 中使用,而后将其用作子查询或作为复合语句中的元素,如 UNION,它将不起作用。 要在子查询中使用任意 SQL 表达式,应使用常规的 Core 风格添加表达式的方法。...with_expression() 作为对象加载选项,只对查询的最外层部分生效,并且仅适用于对完整实体进行的查询,而不适用于子查询中的任意列选择或复合语句(如 UNION)的元素。...如果在将用作子查询或作为联合等复合语句中的元素的`select()`内部使用,则不会产生任何效果。 为了在子查询中使用任意的 SQL 表达式,应该使用正常的 Core 风格添加表达式的方法。
当 DISTINCT 降低内层子查询的性能超出重复的内层行可能导致的性能时,将此标志设置为 False 可能是合适的。 另请参阅 关系加载技术 - 包括对子查询预加载的介绍。...subquery - 项目应该在父项加载时“急切”加载,使用一个额外的 SQL 语句,为每个请求的集合发出一个 JOIN 到原始语句的子查询。...使用通配符取消延迟加载 配置映射器级别的“raiseload”行为 将任意 SQL 表达式加载到对象上 使用 with_expression() 加载 UNIONs、其他子查询 列加载...API 查询对象 查询 ORM 特定的查询构造 为 ORM 映射类编写 SELECT 语句 原文:docs.sqlalchemy.org/en/20/orm/queryguide/select.html...;子查询返回的列与实体映射的列之间必须存在列对应关系,这意味着子查询最终需要来自这些实体,就像下面的示例中一样: >>> inner_stmt = select(User).where(User.id
当使用集合时,yield_per执行选项与“子查询”急加载加载或“连接”急加载不兼容。如果数据库驱动程序支持多个独立游标,则它可能与“选择内”急加载兼容。...attribute single_entity = False 如果为 True,则单个 Bundle 的查询将作为单个实体返回,而不是作为键控元组中的元素。...with_loader_criteria() 选项旨在向查询中的特定类型的实体添加限制条件,全局地,这意味着它将应用于实体在 SELECT 查询中的出现方式以及任何子查询、连接条件和关系加载中,包括急切加载和延迟加载器...with_loader_criteria()选项旨在向查询中的特定实体添加限制条件,全局地应用于实体在 SELECT 查询中的出现以及任何子查询、连接条件和关系加载中,包括急切加载和延迟加载器,而无需在查询的任何特定部分指定它...polymorphic_on - 作为多态加载的“鉴别器”使用的替代列或 SQL 表达式。
子查询急加载的操作是为要加载的每个关系发出第二个 SELECT 语句,跨所有结果对象一次性加载。...表示应该从查询中手动声明的列急加载给定属性。...如果与对象对应的 SQL 不基于本类的本地属性而是基于其超类,则可以在特定类上将此标志设置为True。...子查询急切加载的详细信息请参阅子查询急切加载。...子查询即时加载的操作是为要加载的每个关系发出第二个 SELECT 语句,在所有结果对象中一次完成加载。
此处的方法接受映射类、aliased() 构造和 Mapper 构造作为参数,这些参数会被解析为表达式构造,以及适当的表达式构造。...实体可以是映射类、AliasedClass对象、Mapper对象,以及核心FromClause元素,如子查询。...表示此查询的语句访问器应返回一个 SELECT 语句,该语句将标签应用于形式为_的所有列;这通常用于消除具有相同名称的多个表中的列的歧义。 当查询实际发出 SQL 以加载行时,它总是使用列标签。...property – 表示应使用实例哪个关系来协调父/子关系的类绑定属性。 from_entity – 要考虑为左侧的实体。默认为Query本身的“零”实体。...此处的方法接受映射类、aliased() 构造和 Mapper 构造作为参数,它们会被解析为表达式构造,以及适当的表达式构造。
子属性的加载可配置为以多种方式更“急切”,在本节后面讨论。 下面的示例创建了针对 Employee 超类的查询。...selectinload()接受作为其参数的基本实体,该实体正在被查询,然后是该实体的子类序列,对于这些子类,应为传入的行加载其特定属性: >>> from sqlalchemy.orm import...selectable – 将用于替代生成的 FROM 子句的表或子查询。如果任何所需类使用具体表继承,则此参数是必需的,因为 SQLAlchemy 当前无法自动生成表之间的 UNION。...子属性的加载可配置为以各种方式更加“急切”,这将在本节后面讨论。 下面的示例创建了针对Employee超类的查询。...polymorphic_on – 作为给定可选择对象的“鉴别器”列使用的列。如果未给出,则将使用基类的 mapper 的 polymorphic_on 属性(如果有)。
SQLAlchemy 的连接和子查询急切加载在连接到相关项时在所有情况下使用别名表,因此与自引用连接兼容。...SQLAlchemy 的连接和子查询急切加载在加入相关项时始终使用别名表,因此与自引用连接兼容。...在下面的示例中,我们使用 User 类以及存储街道地址的 Address 类来创建一个关系 boston_addresses,它将仅加载指定城市为“波士顿”的 Address 对象: from sqlalchemy...务必查看子节自引用查询策略和配置自引用急切加载,这两者同样适用于此处讨论的映射模式。...也就是说,在执行每个属性的惰性加载的 SQL 语句中使用它,或者在查询时构造连接,例如通过 Select.join() 或通过急切的“连接”或“子查询”加载样式。
语句 启用 ORM 的 INSERT、UPDATE 和 DELETE 语句 列加载选项 关系加载技术 用于查询的 ORM API 功能 遗留查询 API 使用会话...访问表和元数据 声明性表配置 使用声明性表的显式模式名称 为声明式映射的列设置加载和持久化选项 显式命名声明式映射列 将额外列添加到现有的声明式映射类 使用命令式表进行声明式...具体继承关系的关系 加载具体继承映射 非传统映射 将类映射到多个表 将类映射到任意子查询 一个类的多个映射器 配置版本计数器 简单版本计数 自定义版本计数器...这种映射风格是“声明式”和“命令式”映射的混合,并适用于将类映射到反射的 Table 对象,以及将类映射到现有的 Core 构造,如连接和子查询。...这种映射风格是“声明式”和“命令式”映射的混合体,并适用于将类映射到反射的Table对象,以及将类映射到现有 Core 构造,如连接和子查询。
API 文档 对象名称 描述 set_shard_id 一个加载器选项,用于为语句应用特定的分片 ID 到主查询,以及为其他关系和列加载器。 分片查询 与分片会话一起使用的查询类。...语句的加载器选项,用于将特定的分片 id 应用于主查询,以及额外的关系和列加载器。...,以将特定的分片 ID 应用于主查询,以及额外的关系和列加载器。...语句的加载器选项,可将特定的 shard id 应用于主查询以及用于额外的关系和列加载器。...options(set_shard_id("shard1")) ) 在上述情况下,当调用语句时,主查询以及所有关系和列加载策略,包括诸如selectinload()、延迟列加载器defer()和惰性关系加载器
下面列出了一些常用选项: primary_key:如果设置为True,这列就是表的主键 unique:如果设置为True,这列不允许出现重复的值 index:如果设置为True,为这列创建索引,提升查询效率...default:为这列定义默认值 一对多关系 最为常见的关系就是一对多关系,因为关系在它们建立之前就已经声明。...大多数情况下,db.relationship()都能自行找到关系中的外键,但有时却无法决定把哪一列作为外键。...例如如果address模型中有两个或以上的列定义为person模型的外键,SQLAlchemy就不知道该使用哪列。...可选值有 select(首次访问时按需加载)、immediate(源对象加载后就加载)、 joined(加载记录,但使用联结)、 subquery (立即加载,但使用子查询),noload(永不加载)和
这在某些情况下优于使用混合的用法,因为该值可以在对象的父行加载时一次性加载,特别是如果表达式是链接到其他表(通常作为相关子查询)以访问通常不会在已加载对象上可用的数据的情况。...映射属性中的查询时 SQL 表达式 除了能够在映射类上配置固定的 SQL 表达式之外,SQLAlchemy ORM 还包括一个功能,可以在查询时将对象加载为任意 SQL 表达式的结果,并将其设置为其状态的一部分...在某些情况下,这比使用混合的优势更大,因为值可以在与对象的父行同时加载的同时前置加载,特别是如果表达式是链接到其他表的(通常作为关联子查询)以访问在已加载对象上通常不可用的数据。...查询时 SQL 表达式作为映射属性 除了能够在映射类上配置固定的 SQL 表达式之外,SQLAlchemy ORM 还包括一个功能,即对象可以使用在查询时设置为其状态的任意 SQL 表达式的结果进行加载...group – 标记为延迟加载时,此属性的组名。 deferred – 当为 True 时,列属性为“延迟加载”,意味着它不会立即加载,而是在首次访问实例上的属性时加载。
## 对任意子查询映射类 类似于针对连接的映射,也可以将一个普通的select()对象与映射器一起使用。...以及subq子查询暴露的那些列,即order_count、highest_order和customer_id。...将类映射到任意子查询 类似于对连接进行映射,也可以将一个普通的select()对象与映射器一起使用。...以及subq子查询暴露的那些列,即order_count、highest_order和customer_id。...raiseload – 如果为 True,则表示在未延迟加载列时应引发错误,而不是加载值。可以通过在查询时使用带有 raiseload=False 的 deferred() 选项来更改此行为。
通常,每个包含与上一行不同的 NULL 值组合的列集必须从渲染的 INSERT 语句中省略不同的列系列,这意味着必须作为单独的语句发出。...如果 SessionTransaction.nested 属性为 True,则这是一个 SAVEPOINT,如果为 False,表示这是一个子事务。...限制哪些列与列延迟加载)并且尚未加载 在加载此对象的查询中不存在,例如,在连接表继承和其他场景中常见的情况下。...如果 SessionTransaction.nested 属性为 True,则这是一个保存点,如果为 False,则表示这是一个子事务。...这包括: 通过Session.expire()过期 作为提交会话事务的自然效果而过期,例如Session.commit() 通常是延迟加载,但目前尚未加载 被“延迟加载”(参见限制加载的列与列延迟
使用多对多的“次要”参数进行延迟评估 邻接列表关系 复合邻接列表 自引用查询策略 配置自引用急加载 配置关系连接方式 处理多个连接路径 指定备用连接条件...将别名类映射与类型化集成并避免早期映射器配置 在查询中使用别名类目标 使用窗口函数进行行限制关系 构建支持查询的属性 关于使用 viewonly 关系参数的注意事项...向现有集合添加新项目 查询项目 删除项目 批量插入新项目 项目的批量更新和删除 只写集合 - API 文档 动态关系加载器 动态关系加载器 - API...假设数据库支持这个特性,数据库本身可以被设置为在“子”中的引用行被删除时自动删除“次要”表中的行。...,该列将接收NULL作为其值。
子查询可以用于任何可以放置列表达式的地方: >>> scalar_subq = ( ......子查询可以在任何可以放置列表达式的地方使用: >>> scalar_subq = ( ......它使用一种 SELECT 形式,在大多数情况下可以针对相关表单独发出,而不需要引入 JOIN 或子查询,并且仅查询那些集合尚未加载的父对象。...它使用的 SELECT 形式在大多数情况下可以只针对相关表发出,而不需要引入 JOIN 或子查询,并且仅查询那些尚未加载集合的父对象。...它使用一个 SELECT 形式,在大多数情况下可以针对相关表单独发出,而无需引入 JOIN 或子查询,并且仅查询那些集合尚未加载的父对象。
列选项 选项名 说明 primary_key 如果为True,代表表的主键 unique 如果为True,代表这列不允许出现重复的值 index 如果为True,为这列创建索引,提高查询效率 nullable...如果为True,允许有空值,如果为False,不允许有空值 default 为这列定义默认值 SQLAlchemy 关系选项 选项名 说明 backref 在关系的另一模型中添加反向引用 primary...(一方的类名) 第二个参数backref 为类USer申明新属性的方法 第三个参数 lazy 决定了什么时候SQLAlchemy 从数据库中加载数据 如果设置为子查询方式(subquery),则会在加载完...Role对象后,就立即加载与其关联的对象,这样会让总查询数量减少,但如果返回的条目数量很多,就会比较慢 设置为 subquery 的话,role.users 返回所有数据列表 另外,也可以设置为动态方式...(dynamic),这样关联对象会在被使用的时候再进行加载,并且在返回前进行过滤,如果返回的对象数很多,或者未来会变得很多,那最好采用这种方式 设置为 dynamic 的话,role.users 返回查询对象
对类层次结构中特定子类的查询将作为 SQL JOIN 在其继承路径上的所有表之间进行。如果查询的类是基类,则查询基表,同时可以选择包含其他表或允许后续加载特定于子表的属性的选项。...联接继承层次结构中的基类将配置具有指示多态鉴别器列以及可选地为基类本身配置的多态标识符的其他参数: from sqlalchemy import ForeignKey from sqlalchemy.orm...加载具体继承映射 具体继承加载选项有限;通常,如果在映射器上配置了多态加载,使用其中一个声明性具体混合类,就不能在当前 SQLAlchemy 版本中在查询时修改它。...在层次结构中查询特定子类将作为 SQL JOIN 渲染其继承路径上的所有表。如果查询的类是基类,则将查询基表,同时可以选择包括其他表或允许特定于子表的属性稍后加载。...加载具体继承映射 具体继承加载选项有限;一般来说,如果在映射器上配置了多态加载,使用其中一个声明性的具体混合类,那么在当前的 SQLAlchemy 版本中它就不能在查询时进行修改。
列选项 primary_key:如果为True,代表表的主键 unique:如果为True,代表这列不允许出现重复的值 index:如果为True,为这列创建索引,提高查询效率 nullable:如果为...True,允许有空值,如果为False,不允许有空值 default:为这列定义默认值 2.4 常用的SQLALchemy关系选项 backref:在关系的另一模型中添加反向引用,用于设置外键名称,...在此文中,第一个参数为对应参照的类"User" 第二个参数backref为类User申明新属性的方法 第三个参数lazy决定了什么时候SQLALchemy从数据库中加载数据 如果设置为子查询方式(subquery...),则会在加载完Role对象后,就立即加载与其关联的对象,这样会让总查询数量减少,但如果返回的条目数量很多,就会比较慢 设置为 subquery 的话,role.users 返回所有数据列表 另外,也可以设置为动态方式...(dynamic),这样关联对象会在被使用的时候再进行加载,并且在返回前进行过滤,如果返回的对象数很多,或者未来会变得很多, 那最好采用这种方式 设置为 dynamic 的话,role.users 返回查询对象
我们使用 SQL **别名** 来实现这一点,这是一种为表或子查询提供替代名称的语法,可以在语句中引用它。...- 在 ORM 查询指南 ## 标量和相关子查询 标量子查询是一个返回零行或一行且一列的子查询。...这与在 ORM 实体子查询/CTEs 中引入的方式相同,首先创建我们想要的实体到子查询的临时“映射”,然后从新实体中选择,就像它是任何其他映射类一样。...- 在 ORM 查询指南 中 标量和关联子查询 标量子查询是返回零行或一行以及一列的子查询。...这与 ORM 实体子查询/ CTEs 中介绍的方式相同,首先创建我们所需实体到子查询的临时“映射”,然后从该新实体中选择,就像它是任何其他映射类一样。
如果使用,应该使用适当的加载器选项来为deferred()列进行延迟加载,除了上面注意到的relationship()结构。...此混合类为所有类添加一个新属性 AsyncAttrs.awaitable_attrs ,它将任何属性的值作为可等待返回。...如果在deferred()列中使用了适当的加载选项,应该使用适当的加载选项,此外还应该注意relationship()结构。请参见限制使用延迟列加载的列以获取关于延迟列加载的背景信息。...如果使用deferred()列,应该使用适当的加载器选项,除了如上所述的relationship()构造。有关延迟列加载的背景,请参阅限制使用列延迟加载。...代表AsyncSession类的Session类的代理。 标记实例的属性为过时。下次访问过期的属性时,将在Session对象的当前事务上下文中发出查询,以加载给定实例的所有过期属性。
领取专属 10元无门槛券
手把手带您无忧上云