ORM 事件
ORM包含多种可供订阅的钩子。
有关最常用的ORM事件的介绍,请参阅部分 使用事件跟踪查询、对象和会话更改 . 事件系统一般在 事件 . 有关连接和低级语句执行的非ORM事件如中所述。 核心事件 .
会话事件
最基本的事件钩子在ORM级别可用 Session
对象。这里截获的内容包括:
持久性操作 -向数据库发送更改的ORM刷新过程可以使用在刷新的不同部分触发的事件进行扩展,以增加或修改发送到数据库的数据,或者允许在持久性发生时发生其他事情。阅读有关持久性事件的更多信息,请访问 持久性事件 .
对象生命周期事件 -在会话中添加、持久化和删除对象时挂接。更多信息请访问 对象生命周期事件 .
执行事件 -部分 2.0 style 执行模型、针对发出的ORM实体的所有SELECT语句,以及flush进程之外的批量更新和删除语句,都从
Session.execute()
方法使用SessionEvents.do_orm_execute()
方法。有关此活动的更多信息,请访问 执行事件 .
请务必阅读 使用事件跟踪查询、对象和会话更改 关于这些事件的背景。
Object Name | Description |
---|---|
定义特定于的事件 |
- class sqlalchemy.orm.SessionEvents
映射器事件钩子包含与单个或多个相关的事件
Mapper
对象,它是将用户定义的类映射到Table
对象。发生在Mapper
级别包括:Per-object persistence operations -最流行的mapper钩子是工作单元钩子,例如
MapperEvents.before_insert()
,MapperEvents.after_update()
这些事件与更粗粒度的会话级事件(如SessionEvents.before_flush()
因为它们在刷新过程中以每个对象为基础发生;虽然对象上的细粒度活动更简单,但是Session
功能有限。映射器配置事件 -映射器钩子的另一个主要类是在映射类、完成映射器时以及在映射器集配置为相互引用时发生的类。这些事件包括
MapperEvents.instrument_class()
,MapperEvents.before_mapper_configured()
和MapperEvents.mapper_configured()
在个人Mapper
水平,以及MapperEvents.before_configured()
和MapperEvents.after_configured()
在收藏层面Mapper
物体。
Object Name Description 定义特定于映射的事件。
- class sqlalchemy.orm.MapperEvents
实例事件集中在ORM映射实例的构造上,包括它们被实例化为 transient 对象,当它们从数据库加载并成为 persistent 对象,以及对对象执行数据库刷新或过期操作时。
Object Name Description 定义特定于对象生命周期的事件。
- class sqlalchemy.orm.InstanceEvents
属性事件在ORM映射对象的各个属性上发生时触发。这些事件构成了 custom validation functions 以及 backref handlers .
参见
Object Name Description 定义对象属性的事件。
- class sqlalchemy.orm.AttributeEvents
Object Name Description 表示构造中的事件
Query
对象。 - class sqlalchemy.orm.QueryEvents
定义SQLAlchemy的类检测系统。
此模块通常对用户应用程序不直接可见,但它定义了ORM交互活动的很大一部分。
py处理状态跟踪的最终用户类注册。它与state.py和attributes.py紧密交互,分别建立每个实例和每个类的属性检测。
可以使用
sqlalchemy.ext.instrumentation
模块,它提供了构建和指定备用仪表表单的方法。Object Name Description 与类检测事件相关的事件。
- class sqlalchemy.orm.InstrumentationEvents¶
与类检测事件相关的事件。
这里的侦听器支持针对任何新的样式类(即任何属于“type”子类的对象)建立。然后,针对该类的事件将触发事件。如果将“propagate=true”标志传递给event.listen(),那么该类的子类也将触发该事件。
Python
type
builtin也被接受为一个目标,当使用时,它具有为所有类发出事件的效果。注意这里的“传播”标志默认为
True
,与默认为的其他类级事件不同False
. 这意味着当监听器建立在超类上时,新的子类也将成为这些事件的主题。类签名
class
sqlalchemy.orm.InstrumentationEvents
(sqlalchemy.event.Events
)- method
sqlalchemy.orm.InstrumentationEvents.
attribute_instrument(cls, key, inst)¶ 在检测属性时调用。
示例参数形式:
from sqlalchemy import event @event.listens_for(SomeBaseClass, 'attribute_instrument') def receive_attribute_instrument(cls, key, inst): "listen for the 'attribute_instrument' event" # ... (event handling logic) ...
- method
sqlalchemy.orm.InstrumentationEvents.
class_instrument(cls)¶ 在检测给定类之后调用。
示例参数形式:
from sqlalchemy import event @event.listens_for(SomeBaseClass, 'class_instrument') def receive_class_instrument(cls): "listen for the 'class_instrument' event" # ... (event handling logic) ...
到达
ClassManager
使用manager_of_class()
.
- method
sqlalchemy.orm.InstrumentationEvents.
class_uninstrument(cls)¶ 在给定类未被构造之前调用。
示例参数形式:
from sqlalchemy import event @event.listens_for(SomeBaseClass, 'class_uninstrument') def receive_class_uninstrument(cls): "listen for the 'class_uninstrument' event" # ... (event handling logic) ...
到达
ClassManager
使用manager_of_class()
.
- method