(mapped classes) 已映射或待映射类的未映射超类(使用 propagate=True 标志) Mapper 对象 Mapper 类本身指示监听所有映射器。...event.listen(SomeClass, 'load', my_load_listener) 可用的目标包括: 映射类 映射或将要映射的类的未映射超类(使用 propagate=True...映射或待映射类的未映射超类(使用 propagate=True 标志) Mapper 对象 Mapper 类本身表示监听所有映射器。...此侦听器可以应用于整个 Mapper 类,也可以应用于任何未映射的类,该类用作将要映射的类的基类(使用 propagate=True 标志): Base = declarative_base() @event.listens_for...event.listen(SomeClass, 'load', my_load_listener) 可用的目标包括: 已映射的类 已映射或将要映射的类的未映射超类(使用propagate=True
为一个类映射多个映射器 在现代的 SQLAlchemy 中,一个特定的类一次只能由一个所谓的主要映射器(mapper)映射。这个映射器涉及三个主要功能领域:查询、持久性和对映射类的仪器化。...例如: add_mapped_attribute(User, "addresses", relationship(Address)) 这可用于未使用截获属性设置操作的声明性元类的 ORM 映射。...所有基类的子类隐式声明的所有Table对象将共享此 MetaData。如果未提供,则将创建一个 MetaData 实例。...如果给定类上没有配置映射,则引发UnmappedClassError,或者如果传递了非类对象,则引发ArgumentError。...相当的功能可以通过inspect()函数实现: inspect(some_mapped_class) 如果类未映射,则使用检查系统将引发sqlalchemy.exc.NoInspectionAvailable
声明式数据类映射 SQLAlchemy 带注释的声明表映射可以通过附加的 mixin 类或装饰器指令进行扩展,在映射完成后将映射类原地转换为 Python dataclass,然后完成应用 ORM 特定的仪表化到类的映射过程...## 将 ORM 映射应用于现有数据类(旧版数据类用法) 遗留特性 此处描述的方法已被 2.0 系列 SQLAlchemy 中的声明性数据类映射功能取代。...使用非映射数据类字段 当使用声明性数据类时,类上也可以使用非映射字段,这些字段将成为数据类构造过程的一部分,但不会被映射。任何未使用Mapped的字段都将被映射过程忽略。...将 ORM 映射应用于现有数据类(旧数据类使用) 遗留特性 这里描述的方法已被 SQLAlchemy 2.0 系列中的声明性数据类映射特性取代。...SQLAlchemy ORM 支持使用声明式与命令式表或命令式映射来映射 attrs 类。
使用混合类组合映射层次结构 原文:docs.sqlalchemy.org/en/20/orm/declarative_mixins.html 在使用 Declarative 风格映射类时,常见的需求是共享常见功能...## 使用混合和基类进行映射继承模式 在处理如映射类继承层次结构中记录的映射器继承模式时,当使用 declared_attr 时,可以使用一些附加功能,无论是与混合类一起使用,还是在类层次结构中增加映射和未映射的超类时...在下面的示例中,只有 Person 类将收到名为 id 的列;对于未给出主键的 Engineer,映射将失败: class HasId: id: Mapped[int] = mapped_column...在下面的示例中,只有Person类将接收一个名为id的列;对于未给出主键的Engineer,映射将失败: class HasId: id: Mapped[int] = mapped_column...下面,只有Person类将收到名为id的列;对于未给出主键的Engineer,映射将失败: class HasId: id: Mapped[int] = mapped_column(primary_key
ORMORM(对象关系映射)是一种将关系型数据库中的数据和对象之间进行映射的技术。ORM将数据库中的数据表示为对象,从而使开发人员可以使用面向对象编程语言(如Python)来访问数据库。...在Flask中,您可以使用SQLAlchemy来连接各种类型的数据库。首先,您需要安装SQLAlchemy库。...在上面的代码中,我们首先导入了Flask和SQLAlchemy库,并创建了一个Flask应用程序。然后,我们设置了一个SQLite数据库的URI,并将其传递给SQLAlchemy构造函数。...接下来,我们定义了一个User类,它继承自db.Model类,并定义了三个属性:id、name和email。db.Column函数用于定义每个属性的数据类型和约束。...在index函数中,我们调用db.create_all()方法来创建所有未创建的表。这个方法会自动检测定义的模型,并创建对应的表。如果表已经存在,则不会创建。
参数: mapper – 一个 Mapper 对象,或者一个映射类的实例,或者任何作为一组映射类基础的 Python 类。...解析顺序为: 如果给定了mapper并且Session.binds存在,则首先基于正在使用的映射器,然后基于正在使用的映射类,然后基于映射类的__mro__中存在的任何基类,从更具体的超类到更一般的类来定位一个绑定...字典的键由任何一系列映射类、任意 Python 类(作为映射类的基类)、Table对象和Mapper对象组成。然后,字典的值是Engine的实例,或者较少见的是Connection对象。...如果未配置映射,则引发sqlalchemy.orm.exc.UnmappedInstanceError。...如果未配置映射,则引发sqlalchemy.orm.exc.UnmappedInstanceError。
它生成一个字典类,该类将映射类的特定属性作为键。下面我们映射了一个包含以Note.keyword属性作为键的Note项目字典的Item类。...class sqlalchemy.orm.KeyFuncDict ORM 映射字典类的基础。 使用额外方法扩展了dict类型,这些方法是 SQLAlchemy ORM 集合类所需的。...= sqlalchemy.orm.mapped_collection.KeyFuncDict'> ORM 映射字典类的基础。...,比如在使用 命令式映射 或未类型化的 Python 代码时,以及在一些特殊情况下,总是可以直接指定 relationship() 的集合类,使用 relationship.collection_class...class sqlalchemy.orm.KeyFuncDict ORM 映射字典类的基类。 通过向 SQLAlchemy ORM 集合类添加所需的附加方法来扩展dict类型。
Job.id, Job_A.type == "fred") ) ) ) 另请参见 加入特定子类型或 with_polymorphic()实体 #2438 #1106 事件可应用于未映射的超类...现在可以将映射器和实例事件与未映射的超类关联,这些事件将随着子类映射而传播。...Job.id, Job_A.type == "fred") ) ) ) 另请参阅 连接到特定子类型或 with_polymorphic()实体 #2438 #1106 事件可以应用于未映射的超类...Mapper 和实例事件现在可以与未映射的超类关联,这些事件将随着子类被映射而传播。...现在可以将 Mapper 和实例事件与未映射的超类关联,这些事件将传播到子类中,当这些子类被映射时。
这是因为Mixin不是数据类。 SQLAlchemy 2.0 系列中的数据类功能未正确遵守这一行为;相反,非数据类混合类和超类上的属性将被视为最终数据类配置的一部分。...否则,由于它们的存在是模棱两可的,SQLAlchemy 2.1 将要求在数据类层次结构中具有 SQLAlchemy 映射属性的混合类本身必须是数据类。...当使用在 声明式数据类映射 中描述的 SQLAlchemy ORM 映射数据类功能与任何未本身声明为数据类的 mixin 类或抽象基类一起使用时(例如下面的示例)会出现此警告: from __future...当一个Session一次性删除所有对象时,该Session使用的内部标识映射将被替换为新的,并且原始映射将被丢弃。一个未使用且未缓冲的Result对象将在内部维护对该现在被丢弃的标识映射的引用。...这是因为Mixin不是数据类。 SQLAlchemy 2.0 系列中的数据类功能未正确遵守此行为;相反,非数据类混合类和超类上的属性被视为最终数据类配置的一部分。
class sqlalchemy.orm.util.AliasedClass 表示用于 Query 的映射类的“别名”形式。...给定的类将扩展为包括所有映射的子类,而且本身不必是一个映射的类。...class sqlalchemy.orm.util.AliasedClass 表示与查询一起使用的映射类的“别名”形式。...给定的类将扩展以包括所有映射的子类,本身不必是一个映射的类。...给定的类将扩展以包括所有映射的子类,本身不需要是映射的类。
当将 SQLAlchemy 声明性映射与其他类仪器化系统(如dataclasses和attrs)结合使用时,装饰器形式的映射很有用,尽管请注意,SQLAlchemy 2.0 现在也具有与声明性基类的 dataclasses...使用装饰器形式的映射在将 SQLAlchemy 声明式映射与其他类的装配系统(如dataclasses和attrs)结合时很有用,但要注意,SQLAlchemy 2.0 现在也支持在声明式基类中与 dataclasses..._ = { "include_properties": [user_table.c.user_id, user_table.c.user_name] } 当列未包含在映射中时,在执行...之前,此功能未正常工作。...__ = { "include_properties": [user_table.c.user_id, user_table.c.user_name] } 当列未包含在映射中时,
类签名 类sqlalchemy.orm.exc.StaleDataError(sqlalchemy.exc.SQLAlchemyError) exception sqlalchemy.orm.exc.UnmappedClassError...请求了一个未知类的映射操作。...类签名 类sqlalchemy.orm.exc.UnmappedClassError(sqlalchemy.orm.exc.UnmappedError) method __init__(cls: Type...引发涉及未出现预期映射的异常的基类。...代理AsyncSession类,代表async_scoped_session类。 如果查询未选择任何行,则引发sqlalchemy.orm.exc.NoResultFound。
ORM即Object Relational Mapper,可以简单理解为数据库表和Python类之间的映射,通过操作Python类,可以间接操作数据库。...sqlalchemy版本: 1.3.15 pymysql版本: 0.9.3 mysql版本: 5.7 初始化工作 一般使用ORM框架,都会有一些初始化工作,比如数据库连接,定义基础映射等。...其中model存储的是一些数据库模型,即数据库表映射的Python类;model_op存储的是每个模型对应的操作,即增删查改;调用方(如main.py)执行数据库操作时,只需要调用model_op层,并不用关心...Python类 # py_orm_model.py from .base_model import Base from sqlalchemy import Column, Integer, String...该类是sqlalchemy提供的一个基类,会对我们声明的Python类做一些检查,我将其放在base_model中。
,因为映射类可以为其成员列出具体类型。...SQLAlchemy 的当前集成方法将用户定义的类转换为真正的数据类,以提供运行时功能;该功能利用了 SQLAlchemy 1.4 中引入的现有数据类功能,以在完全集成的配置样式下生成等效的运行时映射,...,因为映射类可以列出其成员的具体类型。...,因为映射类可以为其成员列出特定类型。...可选步骤 - 将映射类转换为 数据类 我们可以将映射类转换为 数据类,其中一个关键优势是,我们可以构建一个严格类型化的 __init__() 方法,具有显式的位置、关键字和默认参数,更不用说我们可以免费获得
一旦类被配置并生成映射,它会被映射自身,但在其所有子类之后。这是在任何其他 SQLAlchemy API 功能中都找不到的非常独特的映射系统。...User 类时,它将表现为一个 SQLAlchemy 映射类。...User类时,它将表现为一个 SQLAlchemy 映射类。...另外,未以其他方式映射的“混合”类(即不从declarative_base()类扩展,也不使用诸如registry.mapped()之类的方法进行映射)应该用declarative_mixin()装饰器进行装饰...User类时,它将表现为 SQLAlchemy 映射类。
关系配置 使用未映射的数据类字段 与 Pydantic 等替代数据类提供者集成 将 ORM 映射应用于现有的数据类(传统数据类使用) 使用声明式与命令式表映射映射预先存在的数据类...在现代 SQLAlchemy 中,这些风格之间的差异基本上是表面的;当使用特定的 SQLAlchemy 配置风格来表达映射类的意图时,映射类的内部映射过程大部分都是相同的,最终的结果始终是一个用户定义的类...声明式映射 声明式映射是现代 SQLAlchemy 中构建映射的典型方式。最常见的模式是首先使用DeclarativeBase 超类构建一个基类。...在现代 SQLAlchemy 中,这些风格之间的区别主要是表面的;当使用特定的 SQLAlchemy 配置风格来表达映射类的意图时,映射类的内部映射过程在大多数情况下是相同的,最终的结果总是一个用户定义的类...deleted=['nickname']) 另请参阅 InstanceState InstanceState.attrs AttributeState ### 默认构造函数 registry 对所有未显式拥有自己
ORM 构造,其他部分未涵盖,列在此处。...Mapped 在映射类上表示 ORM 映射属性。 MappedColumn 将单个Column映射到类上。 MappedSQLExpression ColumnProperty 类的声明性前端。...attribute unmodified 返回没有未提交更改的键的集合。...class sqlalchemy.orm.Mapped 在映射类上表示 ORM 映射属性。 该类表示任何将由 ORM Mapper类检测的类属性的完整描述符接口。...在类上映射单个Column。
该选项接受一个可变数量的类绑定属性对象,指示应该加载的列映射属性,除了主键之外的所有其他列映射属性将不包括在检索的列中。...最终结果类似于在类上使用 column_property() 将任意 SQL 表达式映射到类的情况,只是 SQL 表达式可以在查询时进行修改。...要将 with_expression() 应用于查询,映射类必须预先使用 query_expression() 指令配置了一个 ORM 映射属性;这个指令将在映射类上生成一个适合接收查询时 SQL 表达式的属性...通常在映射上设置未延迟的列作为deferred() 属性。 此函数是 Load 接口的一部分,支持方法链接和独立操作。...要将 with_expression() 应用于查询,映射类必须预先使用 query_expression() 指令配置好一个 ORM 映射属性;此指令将在映射类上生成一个适合接收查询时 SQL 表达式的属性
对于多重绑定或未绑定的Session,使用mapper或clause参数确定要返回的适当绑定。...解析顺序为: 如果提供了映射器并且Session.binds存在,则首先基于正在使用的映射器,然后基于正在使用的映射类,然后基于映射类的__mro__中存在的任何基类,从更具体的超类到更一般的超类进行绑定定位...对于多重绑定或未绑定的Session,将使用mapper或clause参数来确定要返回的适当绑定。...解析的顺序如下: 如果给定了映射器并且存在Session.binds,则首先基于正在使用的映射器,然后基于正在使用的映射类,然后基于映射类的__mro__中存在的任何基类,从更具体的超类到更一般的超类...参数: mapper – 可选的映射类或对应的Mapper实例。
换句话说,基类是“抽象的”。 通常,当想要将两个不同的子类映射到各自的表中,并且将基类保持未映射时,这可以很容易地实现。...这种用法与在 Declarative 中使用 abstract 属性的用法不同,后者将目标类完全未映射,因此不能单独作为映射类使用。...这种用法与在 Declarative 中使用 abstract 属性的用法不同,后者使目标类完全未映射,因此不能作为一个映射类单独使用。...换句话说,基类是“抽象的”。 通常,当一个人想要将两个不同的子类映射到各自的表中,并且保留基类未映射时,这可以非常容易地实现。...换句话说,基类是“抽象的”。 通常,当一个人想要将两个不同的子类映射到单独的表中,并且保留基类未映射时,这可以非常容易地实现。