SQLAlchemy 支持三种继承形式: 单表继承 – 几种类别的类别由单个表表示; 具体表继承 – 每种类别的类别都由独立的表表示; 联接表继承 – 类层次结构在依赖表之间分解。...对类层次结构中特定子类的查询将作为 SQL JOIN 在其继承路径上的所有表之间进行。如果查询的类是基类,则查询基表,同时可以选择包含其他表或允许后续加载特定于子表的属性的选项。...联接继承层次结构中的基类将配置具有指示多态鉴别器列以及可选地为基类本身配置的多态标识符的其他参数: from sqlalchemy import ForeignKey from sqlalchemy.orm...强烈建议如果需要关系加载和多态加载的灵活性,尽量使用连接或单表继承。如果不需要多态加载,则每个类完全引用自己的表时可以使用普通的非继承映射。...强烈建议如果需要灵活性的关系加载和多态加载,尽可能使用连接或单表继承。如果不需要多态加载,则可以使用普通的非继承映射,如果每个类都完全引用其自己的表格。
重点将放在 连接表继承,因为这是最复杂的 ORM 查询情况。 查看此页面的 ORM 设置。 从基类 vs....## 单一继承映射的 SELECT 语句 单一表继承设置 本节讨论单表继承,描述在单表继承中使用单个表表示层次结构中的多个类。 查看本节的 ORM 设置。...selectable – 将用于替代生成的 FROM 子句的表或子查询。如果任何所需类使用具体表继承,则此参数是必需的,因为 SQLAlchemy 当前无法自动生成表之间的 UNION。...如果未提供,则将使用基类映射器的polymorphic_on属性(如果有)。这对于默认没有多态加载行为的映射非常有用。 innerjoin – 如果为 True,则使用 INNER JOIN。...selectable – 将用于替代生成的 FROM 子句的表或子查询。如果所需的任何类使用具体表继承,这个参数是必需的,因为 SQLAlchemy 目前无法自动在表之间生成 UNION。
这在某些定制方案中可能很有用,以确定是否应该基于表本身的参数来执行单表继承,例如,如果没有主键存在,则定义为单继承: class AutoTable: @declared_attr def...在某些定制方案中,这可能是有用的,以确定应基于表本身的参数进行单表继承,例如,如果不存在主键,则定义为单继承: class AutoTable: @declared_attr def _...在一些定制方案中,这可能是有用的,以确定基于表本身的参数是否应该进行单表继承,例如,如果没有主键存在,则定义为单继承: class AutoTable: @declared_attr def...如果 Base 定义了同名属性,则位于继承列表中的第一个类将决定在新定义的类上使用哪个属性。...我们可以在基类中的最低级 __tablename__() 类方法中使用此辅助函数,以便我们有条件地如果表已经存在,则返回 None 作为表名,从而默认为继承子类的单表继承: from sqlalchemy
function sqlalchemy.orm.has_inherited_table(cls: Type[_O]) → bool 给定一个类,如果它继承的任何类都有一个映射表,则返回 True,否则返回...如果此映射器使用单表继承从另一个映射器继承,则可以为 None。在使用声明式时,此参数由扩展自动传递,根据通过 DeclarativeBase....polymorphic_load – 在继承层次结构中的子类中指定“多态加载”行为(仅适用于连接和单表继承)。...共同的父级但不同的分支 method isa(other: Mapper[Any]) → bool 如果此映射器从给定的映射器继承,则返回 True。...这不仅包括直接继承的映射器,还包括所有它们继承的映射器。 attribute single: bool 如果此 Mapper 是单表继承映射器,则表示 True。
一旦类被配置并生成映射,它会被映射自身,但在其所有子类之后。这是在任何其他 SQLAlchemy API 功能中都找不到的非常独特的映射系统。...,“严格”属性模式被启用,试图将基类上的 ORM 映射属性限制为仅当下立即存在的属性,同时仍保留“多态”加载行为。...下面我们建立一个简单的映射与 my_data 表: from sqlalchemy.orm import DeclarativeBase from sqlalchemy.orm import Mapped...下面我们建立一个简单的映射到my_data表: from sqlalchemy.orm import DeclarativeBase from sqlalchemy.orm import Mapped...如果找不到键,则返回默认值(如果给定);否则,引发 KeyError。 method popitem() → Tuple[_KT, _VT] 移除并返回一个(key, value)对作为 2 元组。
在具有子表主键外键到父表主键的联接表继承配置上,现在可以在类似于 PostgreSQL 的具有级联功能的数据库上更新子表。...此外,在多态继承场景中,类绑定描述符指的是多态可选择使用的列,而不一定是直接对应描述符的表列。...对继承类的延迟加载进行了改进,现在映射器在所有情况下都会生成“优化”版本的 SELECT 语句;也就是说,如果类 B 继承自 A,并且类 B 上的几个属性已过期,刷新操作将只包括 B 的表在 SELECT...此外,在多态继承场景中,类绑定的描述符指的是多态可选择的列,而不一定是直接对应描述符的表列。...对于继承类的延迟加载的改进是,映射器现在在所有情况下都生成“优化”版本的 SELECT 语句;也就是说,如果类 B 从 A 继承,并且在类 B 上已经过期了几个属性,则刷新操作将仅在 SELECT 语句中包含
在极少数情况下,如果使用create_engine()函数明确指定AsyncAdaptedQueuePool池类,则也会引发此错误。 另请参阅 连接池 ### 在无效事务回滚之前无法重新连接。...但是,一旦发生这种情况,会话的事务现在处于“不活动”状态,必须由调用方显式地回滚,就像如果没有发生失败,则必须显式地提交一样。...在极少数情况下,如果使用create_engine()函数显式指定了AsyncAdaptedQueuePool池类,则也会引发此错误。 另请参见 连接池 ### 在无效事务回滚之前无法重新连接。...问题在于,在两个共享共同基表的连接继承模型之间进行连接时,如果不对其中一个或另一个应用别名,就无法形成两个实体之间的适当 SQL JOIN;SQLAlchemy 将别名应用于连接的右侧。...问题在于,当在两个共享公共基表的联合继承模型之间进行连接时,如果不对其中一侧应用别名,则无法形成两个实体之间的适当 SQL JOIN;SQLAlchemy 对连接的右侧应用了别名。
另请参见 使用 _orm.declared_attr() 生成特定表继承列 最后,AbstractConcreteBase 类已经重新设计,以便在抽象基类上内联设置关系或其他映射器属性: from sqlalchemy...AS anon_1 #3177 ### 单表继承条件无条件添加到所有 ON 子句 当连接到单表继承子类目标时,ORM 始终在连接关系时添加“单表条件”。...此更改还影响单表继承目标。...AS anon_1 #3177 ### 单表继承条件无条件地添加到所有 ON 子句中 当连接到单表继承子类目标时,ORM 在连接关系时始终添加“单表条件”。...AS anon_1 #3177 单表继承条件无条件添加到所有 ON 子句 当加入到单表继承子类目标时,ORM 总是在关系上加入“单表条件”。
如果我们的模式包含表user和address,我们可以定义要使用的一个或两个类: from sqlalchemy.ext.automap import automap_base from sqlalchemy...如果表包含两个且仅两个 ForeignKeyConstraint 对象,并且此表中的所有列都是这两个 ForeignKeyConstraint 对象的成员,则假定该表是“secondary”表,并且不会直接映射...请注意,这意味着自动映射将不会为从子类到父类的外键生成 任何 关系。如果一个映射还具有从子类到父类的实际关系,那么这些关系需要是显式的。...如果表包含两个且仅两个ForeignKeyConstraint对象,并且此表中的所有列都是这两个ForeignKeyConstraint对象的成员,则假定该表是“次要”表,并且不会直接映射。...如果表包含两个并且仅有两个 ForeignKeyConstraint 对象,并且此表中的所有列都是这两个 ForeignKeyConstraint 对象的成员,则假定该表是一个“次要”表,并且不会直接映射
如果找不到实例的 InstanceState,“state getter” 可调用应引发 KeyError 或 AttributeError。...处于删除状态的对象保证不在其父Session的Session.identity_map 中;但是如果会话的事务被回滚,对象将被恢复到持久状态和标识映射。...如果对象已被垃圾收集,则返回None。 attribute pending 如果对象是挂起的,则返回True。...__eq__ 方法继承 实现 == 运算符。 在列上下文中,生成子句 a = b。如果目标是 None,则生成 a IS NULL。...__ne__ 方法继承 实现 != 运算符。 在列上下文中,生成子句 a != b。如果目标是 None,则生成 a IS NOT NULL。
如果 Session 对象的事务被回滚,则对象将被恢复为持久状态;将调用 SessionEvents.deleted_to_persistent() 转换。...另请参阅 强制在具有默认值的列上使用 NULL #3250 ### 进一步修复单表继承查询 继续从 1.0 的 使用 from_self(), count() 时对单表继承条件的更改,Query 在查询针对子查询表达式时...另请参阅 强制在具有默认值的列上使用 NULL #3250 ### 进一步修复了单表继承查询问题 继续从 1.0 的在使用 from_self(),count()时更改单表继承条件,Query在查询针对子查询表达式时...如果 Session 对象的事务被回滚,则对象将被恢复为持久状态;将调用 SessionEvents.deleted_to_persistent() 过渡。...另请参见 强制在具有默认值的列上使用 NULL #3250 进一步修复单表继承查询 继续从 1.0 的 Change to single-table-inheritance criteria when
dictlike.py - 将垂直表映射为字典。 ## 继承映射配方 基本继承映射 单表、联接表和具体表继承的工作示例,如映射类继承层次结构中所述。...single.py - 单表(基于层次结构的表)继承示例。 特殊 API 属性仪器化 示例说明了对 SQLAlchemy 属性管理系统的修改。...dictlike.py - 将垂直表映射为字典。 继承映射配方 基本继承映射 单表、联表和具体表继承的工作示例,如映射类继承层次结构中所述。...single.py - 单表(按层次结构划分)继承示例。...single.py - 单表(按层次结构划分)继承示例。 特殊 API 属性仪器化 示例说明了对 SQLAlchemy 属性管理系统的修改。
这是正确的行为,因为如果传入状态包含一个过期的版本 id,则应该假设该状态已过期。 如果将数据合并到一个有版本控制的状态中,则版本 id 属性可以不定义,并且不会进行版本检查。...,或者特定子类的映射父类实例的特定属性。...,而不是父表的值。...然而,如果某个应用程序不知情地依赖于此行为,则这可能是潜在的向后不兼容的情况。...,而不是父表的值。
渲染逻辑使用与单表继承相同的系统来确保某个鉴别器应用于表。...呈现逻辑使用与单表继承相同的系统来确保某个鉴别器应用于表。...SQL 相同,这意味着适当的状态从 Python 中的父对象中获取,而不需要在渲染的语句中渲染到父表的连接。...渲染逻辑使用与单表继承相同的系统,以确保某个鉴别器应用于表。...渲染逻辑使用与单表继承相同的系统来确保某个特定的鉴别器应用于表。
该选项接受一个类绑定的属性,指示应针对特定类/属性进行定位: from sqlalchemy import select from sqlalchemy.orm import lazyload # set...如果未提供此项,则 ORM 将引发错误。 这在现代 SQLAlchemy 中不是自动的,因为它会更改结果集的行为,使其返回的 ORM 对象比语句通常返回的行数少。...类sqlalchemy.orm.Load (sqlalchemy.orm.strategy_options....如果与对象对应的 SQL 不基于本类的本地属性而是基于其超类,则可以在特定类上将此标志设置为True。...类sqlalchemy.orm.Load(sqlalchemy.orm.strategy_options.
,前提是 UPDATE 的目标是本地表上的表,或者如果父表和子表混合,它们在查询中被显式连接。...该功能允许仅使用占位符Table元数据构建声明性映射类,直到调用prepare()步骤,给定一个Engine以完全反映所有表并建立实际映射。该系统支持列的覆盖,单一和联合继承,以及每个引擎的不同基础。...,前提是 UPDATE 的目标是本地表上的,或者如果父表和子表混合,则它们在查询中明确连接。...该系统支持列的重写、单一和连接继承,以及每个引擎的不同基类。...,前提是 UPDATE 的目标是过滤表上的本地表,或者如果父表和子表混合,它们在查询中明确连接。
混合列 混合关联 混合 _orm.column_property() 和其他 _orm.MapperProperty 类 使用 Mixins 和基类与映射继承模式 在继承...对于继承映射(在映射类继承层次结构中详细描述),应将装饰器应用于要映射的每个子类: from sqlalchemy.orm import registry mapper_registry = registry...在使用单表继承的特定情况下,也可以向映射添加额外的Column对象,在这种情况下,映射的子类上存在额外的列,但它们没有自己的Table。这在单表继承部分有所说明。...在使用单表继承的特定情况下,还可以向映射添加其他Column对象,在此情况下,映射的子类上存在其他列,这些列没有自己的Table。这在单表继承部分进行了说明。...在使用单表继承的特定情况下,还可以将其他 Column 对象添加到映射中,其中在映射的子类上存在其他列,这些列没有自己的 Table。这在 单表继承 部分有说明。
mappings - 一系列字典,每个字典包含要插入的映射行的状态,以映射类上的属性名称表示。如果映射涉及多个表,例如连接继承映射,则每个字典必须包含要填充到所有表中的所有键。...mappings - 一个字典序列,每个字典包含要更新的映射行的状态,以映射类上的属性名称表示。如果映射涉及多个表,比如联接继承映射,每个字典可能包含与所有表对应的键。...如果在本地找不到,则尝试根据主键从数据库加载对象,如果找不到,则创建一个新实例。然后将源实例上的每个属性的状态复制到目标实例。...mappings – 一个字典序列,每个字典包含要插入的映射行的状态,以映射类上的属性名称为准。如果映射涉及多个表,比如联合继承映射,每个字典必须包含要填充到所有表中的所有键。...如果在本地找不到,则尝试根据主键从数据库加载对象,如果找不到,则创建一个新实例。然后将源实例上的每个属性的状态复制到目标实例。
迄今为止的 ORM 文档: www.sqlalchemy.org/docs/04/session.html#unitofwork_managing 继承 无连接或联合的多态继承 继承的新文档:www.sqlalchemy.org.../docs/04 /mappers.html#advdatamapping_mapper_inheritance_joined 使用 get() 时更好的多态行为 加入表继承层次结构中的所有类都使用基类获得...迄今为止的 ORM 文档: www.sqlalchemy.org/docs/04/session.html#unitofwork_managing 继承 无联接或联合的多态继承 继承的新文档:www.sqlalchemy.org...迄今为止的 ORM 文档: www.sqlalchemy.org/docs/04/session.html#unitofwork_managing 继承 无连接或联合的多态继承 继承的新文档:www.sqlalchemy.org...使用 get() 时更好的多态行为 在连接表继承层次结构中,所有类都使用基类获取_instance_key,即(BaseClass, (1, ), None)。
2.多态 答:定义时的类型和运行时的类型不一样,此时就是多态。python中,多态就是弱化类型,重点在于对象参数是否有指定的属性和方法,如果有,就认定合适,而不关心对象的类型是否正确。...4.Django中ORM如何使用? Django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。...多继承会继承所有父类的属性和方法。如果多个父类中有同名的属性和方法,则默认使用第一个父类的属性和方法。...我们可以根据 __mro__(是一个魔法方法,称为方法解析顺序,用来获取当前类的方法继承顺序)来查看继承顺序。 在腾讯面试中,面试官质疑我的答案,觉得多个父类有同名的方法,继承的不是第一个。...7.继承,在执行析构函数时,先执行父类的,还是先执行子类的? 答:析构时,会先调用子类的析构函数,再调用父类的。 初始化子类时,会先自动调用父类的构造函数,然后调用子类的构造函数。
领取专属 10元无门槛券
手把手带您无忧上云