生成的基类,当被子类化时,将对从它派生的所有子类应用声明式映射过程,相对于默认情况下新基类的本地registry。...这种映射风格是“声明式”和“命令式”映射的混合,并适用于将类映射到反射的 Table 对象,以及将类映射到现有的 Core 构造,如连接和子查询。...结果基类,当被子类继承时,将对所有从它继承的子类应用声明式映射过程,相对于默认情况下新基类的本地 registry。...这种映射风格是“声明式”和“命令式”映射的混合体,并适用于将类映射到反射的Table对象,以及将类映射到现有 Core 构造,如连接和子查询。...这种映射方式是“声明式”和“命令式”映射的混合体,适用于诸如将类映射到反射的Table对象,以及将类映射到现有的 Core 构造,如联接和子查询的技术。 声明式映射的文档继续在用声明式映射类中。
在那些被映射的反射表不包含主键约束的情况下,以及在针对任意可选择项进行映射的一般情况下,可能不存在主键列的情况下,提供了 Mapper.primary_key 参数,以便可以将任何一组列配置为表的“主键...FROM 子句(如连接和选择)的情况下也很重要。...FROM 子句(如连接和选择)的情况下也很重要。...在需要映射的反射表不包含主键约束的情况下,以及在映射对任意可选择内容的情况下,主键列可能不存在的一般情况下,提供了 Mapper.primary_key 参数,以便将任何一组列配置为表的“主键”,就 ORM...### 使用 DeferredReflection 为了适应声明映射类的用例,在此之后可以发生表元数据的反射,提供了一个简单的扩展叫做DeferredReflection mixin,它修改了声明性映射过程
为了启用使用类继承的数据类,我们利用了 MappedAsDataclass mixin,可以直接在每个类上使用,也可以在 Base 类上使用,如下所示,在这里我们进一步修改了来自 “Step 5” 的示例映射...SQLAlchemy 的当前集成方法将用户定义的类转换为真正的数据类,以提供运行时功能;该功能利用了 SQLAlchemy 1.4 中引入的现有数据类功能,以在完全集成的配置样式下生成等效的运行时映射,...为了启用使用类继承的数据类,我们利用了MappedAsDataclass mixin,可以直接在每个类上使用,也可以在Base类上使用,如下面的示例所示,我们进一步修改了“步骤 5”的示例映射来自 ORM...迁移现有映射 转向新的 ORM 方法开始时更加冗长,但随着可用的新功能的充分利用,它变得比以前更加简洁。以下步骤详细介绍了一个典型的转换,然后继续说明了一些更多的选项。...为了使用类继承启用数据类,我们使用MappedAsDataclass mixin,可以直接在每个类上使用,也可以在Base类上使用,如下所示,我们进一步修改了来自 ORM 声明性模型“步骤 5”的示例映射
如果未使用 AttributeEvents.include_key 设置事件,根本不会将参数传递给事件;这是为了与不包含 key 参数的现有事件处理程序向后兼容。 在版本 2.0 中新增。...如果未使用 AttributeEvents.include_key 设置事件,参数根本不会传递给事件;这是为了允许现有事件处理程序与不包含 key 参数的事件处理程序向后兼容。..._events 仪器化事件 定义了 SQLAlchemy 的类仪器化系统。 这个模块通常对用户应用程序不直接可见,但定义了 ORM 交互的大部分内容。...警告 此事件在 Session 发出 SQL 修改数据库之后运行,但在它修改内部状态以反映这些更改之前运行,包括将新插入的对象放入标识映射中。..._events 进行双向处理 仪器化事件 定义了 SQLAlchemy 的类仪器化系统。 此模块通常不直接对用户应用程序可见,但定义了 ORM 交互的大部分内容。
这样做的原因是为了在返回的结构中保留其他类级别属性,如文档字符串和对混合属性本身的引用,而不对传入的原始比较器对象进行任何修改。...这样做的原因是为了在返回的结构中保留其他类级别属性,如文档字符串和对混合属性本身的引用,而不对传入的原始比较器对象进行任何修改。...这样做的原因是为了在返回的结构中保持其他类级别属性(如文档字符串和对混合本身的引用),而不对传入的原始 SQL 表达式进行任何修改。...hybrid_property.overrides 访问器只是返回这个混合对象,当在父类的类级别调用时,将取消引用通常在此级别返回的“instrumented attribute”,并允许修改装饰器,如...hybrid_property.overrides 访问器只是返回这个混合对象,当在父类的类级别调用时,将取消引用通常在此级别返回的“instrumented attribute”,并允许修改装饰器,如
要在甚至不尝试编译 Cython 扩展的情况下运行构建/安装,可以指定 DISABLE_SQLALCHEMY_CEXT 环境变量。...在即使不尝试编译 Cython 扩展的情况下运行构建/安装时,可以指定DISABLE_SQLALCHEMY_CEXT环境变量。...若要在甚至不尝试编译 Cython 扩展的情况下运行构建/安装,可以指定 DISABLE_SQLALCHEMY_CEXT 环境变量。...映射类是我们想要创建的任何 Python 类,然后它将具有链接到数据库表中列的属性。虽然有几种实现方式,但最常见的风格称为 声明式,它允许我们一次声明我们的用户定义类和 Table 元数据。...类变量访问它: >>> Base.registry ```### 声明映射类 有了`Base`类的设立
属性配置 SQLAlchemy 原生数据类与普通数据类的不同之处在于,要映射的属性在所有情况下都是使用Mapped泛型注解容器来描述的。...属性配置 SQLAlchemy 原生数据类与普通数据类不同之处在于,要映射的属性在所有情况下都是使用 Mapped 泛型注释容器描述的。...将 ORM 映射应用于现有数据类(旧数据类使用) 遗留特性 这里描述的方法已被 SQLAlchemy 2.0 系列中的声明性数据类映射特性取代。...可以使用 registry.map_imperatively() 方法将“命令式”映射应用于现有数据类,以完全相同的方式生成映射,如命令式映射中所述。下面在 使用命令式映射预存在的数据类中说明。...它仍然会得到支持,但不太可能在声明式数据类映射的新方法面前提供任何优势。
,但在通常情况下比混合和列属性方法性能更低,因为它需要在每次访问时发出 SQL 查询。...当使用使用声明式基类(即由 DeclarativeBase 超类或遗留函数如 declarative_base() 生成的映射)时,此属性分配具有调用 Mapper.add_property() 的效果...这在一些编码/解码风格在数据进入数据库和返回时都会发生的情况下更为常见;在 Core 文档的扩充现有类型中了解更多信息。 使用描述符和混合体 影响属性的修改行为的更全面的方法是使用描述符。...这在某些编码/解码样式在数据进入数据库和返回时都发生的情况下更为常见;在核心文档中阅读更多关于此的内容,参见扩充现有类型。 使用描述符和混合类型 产生修改后的属性行为的更全面的方法是使用描述符。...我们还将实现__composite_values__()方法,这是一个固定名称,被composite()构造函数所识别(在使用传统非数据类中介绍过),它指示了一种接收对象作为列值的标准方式,这种情况下将取代通常的数据类方法论
当与此属性相关联的是一个Comparator类时,它允许自定义重新定义所有现有运算符,以及定义新的运算符。现有运算符包括通过 Python 运算符重载提供的运算符,如ColumnOperators....UserDefinedType的默认行为与TypeDecorator的默认行为相同;默认情况下,它返回self,假设比较的值应强制转换为与此相同类型。...SQLAlchemy 的 PostgreSQL 方言具有一个硬编码映射,将字符串名称"VARCHAR"链接到 SQLAlchemy VARCHAR类,这就是为什么当我们发出类似Table('my_table...当与此属性关联的Comparator类时,它允许自定义重新定义所有现有运算符,以及定义新的运算符。现有运算符包括通过 Python 运算符重载提供的ColumnOperators....SQLAlchemy 的 PostgreSQL 方言有一个硬编码的映射,将字符串名称"VARCHAR"链接到 SQLAlchemy VARCHAR 类,这就是当我们发出像Table('my_table'
它还可以通过简单的子类化进行扩展,其中主要的重写功能是如何返回表达式集,允许后处理以及自定义返回类型,而不涉及 ORM 标识映射的类。...它还可以通过简单的子类化进行扩展,其中要覆盖的主要能力是如何返回表达式集,允许后处理以及自定义返回类型,而不涉及 ORM 身份映射的类。...当给定类是具有许多不同映射子类的基类时,这也可以是“lambda:”或 Python 函数,它接受目标类作为参数。...结果对象是 AliasedClass 的一个实例。此对象实现了与原始映射类相同的属性和方法接口,允许 AliasedClass 兼容任何在原始类上工作的属性技术,包括混合属性(参见混合属性)。...它还可以通过简单的子类扩展,其中主要的重写功能是如何返回表达式集,允许后处理以及自定义返回类型,而不涉及 ORM 身份映射类。
简单来说,只要接入现有的查询逻辑(比如数据库查询,RPC 调用等)即可,这里不展开了。下面要讲到 SQLAlchemy 的集成,会提到怎样通过集成来减少实现 resolve 的工作量。...根据之前的描述,我们现定义 SQLAlchemy 的表及其对应映射类如下: # Table: starship = Table( 'starship', metadata, Column...的表和映射类的方式有很多种,这里只是其中一种方法。...注意到两个映射类 LnCrew 和 LnStarship 内部其实什么都没做,当它们和数据表建立映射关系后查询出的实例中会自动填充上数据库表中定义的各字段。...SQLAlchemyObjectType ,并在类中定义 Meta 类指定相关的 SQLAlchemy 映射类作为模型; 移除所有重复的字段定义 (✌️); 保留数据库定义与 GraphQL 对象类型定义不完全相同的字段
如何在给定映射类的情况下获取所有列、关系、映射属性等的列表?...基于列的属性可以在映射中被赋予任何所需的名称。请参阅明确命名声明式映射的列。 如何在给定一个映射类的情况下获取所有列、关系、映射属性等列表? 所有这些信息都可以从 Mapper 对象中获得。...有关此事的详细信息,请参阅 刷新 / 过期。 我们可以在设置了“填充现有”选项的情况下运行整个查询,这样它们读取行时就会覆盖已加载的对象。这是一个在 填充现有 中描述的执行选项。...有关此操作的详细信息,请参阅刷新/过期。 我们可以在设置了“填充现有”选项的情况下运行整个查询,以确保在读取行时覆盖已加载的对象。这是一种在填充现有中描述的执行选项。...如果 Session.flush() 能部分完成然后不回滚,那将会很好,但是由于它当前的能力限制,这是不可能的,因为它的内部记录必须被修改,以便随时停止,并且与已刷新到数据库的内容完全一致。
也就是说,如果一个记录 PtoQ 被映射到“p”和“q”表,其中它基于“p”和“q”的 LEFT OUTER JOIN 有一行,如果进行一个 UPDATE 来修改现有记录中“q”表中的数据,那么“q”中的行必须存在...也就是说,如果将记录 PtoQ 映射到“p”和“q”表,其中它基于“p”和“q”的 LEFT OUTER JOIN 的行,如果进行更新以更改现有记录中“q”表中的数据,则“q”中的行必须存在;如果主键标识已经存在...这是一种问题的传统行为,对于某些后端(如 Oracle)存在问题 - 在这种情况下,可以将其设置为 False。...这些属性在所有情况下都是与映射类或其超类关联的 Python 描述符。 此命名空间包括映射到类的属性以及由扩展模块声明的属性。它包括任何从InspectionAttr继承的 Python 描述符类型。...在继承场景中,它引用继承链中所有其他Mapper对象的父级Mapper。 这是在映射器构建期间确定的只读属性。如果直接修改,行为未定义。
通过严格在映射器配置级别解决该问题,并与现有的声明类技术完全集成,AutomapBase试图提供一个与问题紧密集成的方法,以迅速自动生成临时映射。...然后,我们调用AutomapBase.prepare()在生成的基类上,要求它反映模式并生成映射: from sqlalchemy.ext.automap import automap_base from...从现有元数据生成映射 我们可以将预先声明的MetaData对象传递给automap_base()。...然后,我们调用 AutomapBase.prepare() 在生成的基类上,要求它反映架构并生成映射: from sqlalchemy.ext.automap import automap_base from...重要的是要注意,默认的关联命名从实际类名派生名称。如果您通过声明为特定类指定了显式名称,或指定了替代类命名方案,则关系名称将从该名称派生。 检查类以查找与这些名称匹配的现有映射属性。
对于所有这些无法检测到类型的情况,它都将发出一个信息丰富的错误消息,在所有情况下,可以明确提供适当的类型,要么使用Mapped类,要么选择在内联声明中省略它。...不具有显式类型的列 包含 ForeignKey 修改器的列在 SQLAlchemy 声明性映射中不需要指定数据类型。...[int] company: Mapped["Company"] 与数据类或其他类型敏感的属性系统结合 Python 数据类集成示例中的将 ORM 映射应用到现有数据类(旧数据类使用)存在一个问题...在我们的情况下,这是件好事,因为如果这个字典是可 pickle 的,那么它可能会导致我们的值对象的 pickle 大小过大,因为它们在不涉及父对象上下文的情况下被单独 pickle。...在我们的情况下,这是一件好事,因为如果这个字典是可 pickle 的,那么它可能会导致我们的值对象的 pickle 大小过大,这些值对象是在不涉及父对象的情况下 pickle 的。
ORMExecuteState 能够控制给定语句的执行;这包括不执行该语句的能力,允许从缓存中检索到的预构造结果集被返回,以及多次以不同状态调用相同语句的能力,例如对多个数据库连接执行它,然后在内存中合并结果...Session.get()是特殊的,因为它直接提供了对Session的标识映射的访问。...警告 make_transient() 不“取消过期”或以其他方式急切加载目前未加载的 ORM 映射属性。...对于一般的 INSERT 和更新现有 ORM 映射对象,建议使用标准的工作单元数据管理模式,介绍在 SQLAlchemy 统一教程中的 ORM 数据操作。...Session.get() 是特殊的,因为它直接提供对Session的标识映射的访问。
在这种情况下,我们必须确保 SQLAlchemy 可以“预执行”默认值,这意味着它必须是一个显式的 SQL 表达式。...该参数接收一个包含任意 ORM 映射类、映射层次结构中的任意类(如声明基类或混合类)、`Table`对象和`Mapper`对象的字典作为键,然后通常引用`Engine`或不太常见的是`Connection...在这种情况下,我们必须确保 SQLAlchemy 可以“预先执行”默认值,这意味着它必须是一个明确的 SQL 表达式。...在这种情况下,我们必须确保 SQLAlchemy 可以“预执行”默认值,这意味着它必须是一个显式的 SQL 表达式。...此参数接收一个包含任意组合的 ORM 映射类、映射层次结构中的任意类(如声明性基类或混合类)、Table 对象和Mapper 对象作为键的字典,然后通常引用Engine 或较不常见的 Connection
在本节中,我们将涵盖 Update 和 Delete 构造,用于修改现有行以及删除现有行。 本节将从核心的角度讨论这些构造。...与insert()构造类似,还有一种“传统”的update()形式,它一次只针对一个表发出 UPDATE,不返回任何行。...这使它能够根据给定的一组待处理更改,更好地决定如何在事务中发出 SQL DML。当它确实向数据库发出 SQL 以推送当前更改集时,该过程被称为刷新。...,即 ORM 如何与引用其他对象的映射类交互。...在 声明映射类 部分,映射类示例使用了一种称为 relationship() 的构造。此构造定义了两个不同映射类之间的链接,或者从一个映射类到它自身,后者称为自引用关系。
但是目标是映射到的 Table 或其他 Core 可选择对象,而不是 ORM 实体,如映射的类或aliased()构造: a1 = Address....RemovedIn20Warning弃用警告是该系统的基础,用于提供关于现有代码库中需要修改的行为的指导。如何启用此警告的概述在 SQLAlchemy 2.0 弃用模式中。...Table或其他映射到类的 Core 可选择对象,而不是 ORM 实体,如映射类或aliased()构造: a1 = Address....RemovedIn20Warning废弃警告是该系统的基础,提供了关于现有代码库中需要修改的行为的指导。如何启用此警告的概述在 SQLAlchemy 2.0 Deprecations Mode 中。...RemovedIn20Warning 弃用警告是这个系统的基础,它提供了对现有代码库中需要修改的行为的指导。关于如何启用此警告的概述在 SQLAlchemy 2.0 弃用模式 中。
在映射时配置加载策略 特定关系的加载策略可以在映射时配置,以在加载映射类型的对象的所有情况下发生,即使没有修改它的任何查询级别选项。...要沿着路径导航而不更改特定属性的现有加载器样式,请使用 defaultload() 方法/函数: from sqlalchemy import select from sqlalchemy.orm import...当使用查询选项如joinedload()、defer()或类似选项时,Load对象在大多数情况下会在幕后隐式使用。除了一些非常特殊的情况外,通常不会直接实例化它。...如果与对象对应的 SQL 不基于本类的本地属性而是基于其超类,则可以在特定类上将此标志设置为True。...在映射时间配置加载策略 特定关系的加载策略可以在映射时间配置,以在加载映射类型的对象的所有情况下发生,没有任何修改它的查询级选项的情况下。
领取专属 10元无门槛券
手把手带您无忧上云