目录

ORM 事件

优质
小牛编辑
187浏览
2023-12-01

ORM包含多种可供订阅的钩子。

有关最常用的ORM事件的介绍,请参阅部分 使用事件跟踪查询、对象和会话更改 . 事件系统一般在 事件 . 有关连接和低级语句执行的非ORM事件如中所述。 核心事件 .

会话事件

最基本的事件钩子在ORM级别可用 Session 对象。这里截获的内容包括:

  • 持久性操作 -向数据库发送更改的ORM刷新过程可以使用在刷新的不同部分触发的事件进行扩展,以增加或修改发送到数据库的数据,或者允许在持久性发生时发生其他事情。阅读有关持久性事件的更多信息,请访问 持久性事件 .

  • 对象生命周期事件 -在会话中添加、持久化和删除对象时挂接。更多信息请访问 对象生命周期事件 .

  • 执行事件 -部分 2.0 style 执行模型、针对发出的ORM实体的所有SELECT语句,以及flush进程之外的批量更新和删除语句,都从 Session.execute() 方法使用 SessionEvents.do_orm_execute() 方法。有关此活动的更多信息,请访问 执行事件 .

请务必阅读 使用事件跟踪查询、对象和会话更改 关于这些事件的背景。

Object NameDescription

SessionEvents

定义特定于的事件 Session 生命周期。

class sqlalchemy.orm.SessionEvents

映射器事件钩子包含与单个或多个相关的事件 Mapper 对象,它是将用户定义的类映射到 Table 对象。发生在 Mapper 级别包括:

Object NameDescription

MapperEvents

定义特定于映射的事件。

class sqlalchemy.orm.MapperEvents

实例事件集中在ORM映射实例的构造上,包括它们被实例化为 transient 对象,当它们从数据库加载并成为 persistent 对象,以及对对象执行数据库刷新或过期操作时。

Object NameDescription

InstanceEvents

定义特定于对象生命周期的事件。

class sqlalchemy.orm.InstanceEvents

属性事件在ORM映射对象的各个属性上发生时触发。这些事件构成了 custom validation functions 以及 backref handlers .

参见

更改属性行为

Object NameDescription

AttributeEvents

定义对象属性的事件。

class sqlalchemy.orm.AttributeEvents
Object NameDescription

QueryEvents

表示构造中的事件 Query 对象。

class sqlalchemy.orm.QueryEvents

定义SQLAlchemy的类检测系统。

此模块通常对用户应用程序不直接可见,但它定义了ORM交互活动的很大一部分。

py处理状态跟踪的最终用户类注册。它与state.py和attributes.py紧密交互,分别建立每个实例和每个类的属性检测。

可以使用 sqlalchemy.ext.instrumentation 模块,它提供了构建和指定备用仪表表单的方法。

Object NameDescription

InstrumentationEvents

与类检测事件相关的事件。

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() .