本节描述了基于类的ORM事件接口,它首先存在于sqlAlchemy 0.1中,在sqlAlchemy 0.5之前,它会随着更多类型的事件而发展。非ORM模拟在 不推荐使用的事件接口 .
0.7 版后已移除: 从SQLAlchemy 0.7开始,新的事件系统在 事件 替换扩展/代理/侦听器系统,为所有事件提供一致的接口,而不需要子类化。
sqlalchemy.orm.interfaces.
MapperExtension
¶的基本实现 Mapper
事件钩子。
0.7 版后已移除: MapperExtension
已弃用,将在将来的版本中删除。请参考 event.listen()
与 MapperEvents
侦听器接口。
新扩展类子类 MapperExtension
并使用 extension
mapper()参数,它是一个 MapperExtension
或者一张这样的清单:
from sqlalchemy.orm.interfaces import MapperExtension
class MyExtension(MapperExtension):
def before_insert(self, mapper, connection, instance):
print "instance %s before insert !" % instance
m = mapper(User, users_table, extension=MyExtension())
一个映射器可以维护 MapperExtension
对象。当一个特定的映射事件发生时,每个 MapperExtension
是串行调用的,并且每个方法都有能力阻止链进一步进行:
m = mapper(User, users_table, extension=[ext1, ext2, ext3])
各 MapperExtension
方法默认返回符号ext_continue。此符号通常表示“移动到下一个” MapperExtension
用于处理”。对于返回已翻译行或新对象实例等对象的方法,ext_continue意味着应忽略该方法的结果。在某些情况下,需要执行默认映射器活动,例如将新实例添加到结果列表中。
符号ext_stop在 MapperExtension
返回此符号时链将停止的对象。像ext-continue一样,它在某些情况下还具有额外的意义,即不会执行默认的映射器活动。
after_delete
(mapper, connection, instance)¶删除该实例后接收对象实例。
返回值仅在 MapperExtension
链;父映射器的行为不会被此方法修改。
after_insert
(mapper, connection, instance)¶插入该实例后接收对象实例。
返回值仅在 MapperExtension
链;父映射器的行为不会被此方法修改。
after_update
(mapper, connection, instance)¶更新该实例后接收对象实例。
返回值仅在 MapperExtension
链;父映射器的行为不会被此方法修改。
before_delete
(mapper, connection, instance)¶在删除对象实例之前接收该实例。
注意 no 可以在此处更改整体刷新计划;以及 Session
不会产生预期效果。操纵 Session
在扩展中,使用 SessionExtension
.
返回值仅在 MapperExtension
链;父映射器的行为不会被此方法修改。
before_insert
(mapper, connection, instance)¶在将对象实例插入其表之前接收该实例。
这是一个设置主键值的好地方,这样就不会被处理。
可以在此方法中修改基于列的属性,这将导致插入新值。然而 no 可以对整体刷新计划进行更改,并对 Session
不会产生预期效果。操纵 Session
在扩展中,使用 SessionExtension
.
返回值仅在 MapperExtension
链;父映射器的行为不会被此方法修改。
before_update
(mapper, connection, instance)¶在更新对象实例之前接收该实例。
请注意,对于所有标记为"dirty"的实例,甚至那些对基于列的属性没有净更改的实例,都会调用此方法。当对象的任何基于列的属性调用了“set attribute”操作或修改了其任何集合时,该对象被标记为脏对象。如果在更新时,没有基于列的属性有任何净更改,则不会发出更新语句。这意味着在更新之前发送到的实例 not 保证将发出更新声明(尽管您可以影响此处的结果)。
若要检测对象上基于列的属性是否有净更改,从而生成更新语句,请使用 object_session(instance).is_modified(instance, include_collections=False)
.
可以在此方法中修改基于列的属性,这将导致更新新值。然而 no 可以对整体刷新计划进行更改,并对 Session
不会产生预期效果。操纵 Session
在扩展中,使用 SessionExtension
.
返回值仅在 MapperExtension
链;父映射器的行为不会被此方法修改。
init_failed
(mapper, class_, oldinit, instance, args, kwargs)¶当其构造函数被调用时接收实例,并引发异常。
此方法仅在对象的userland构造期间调用。当从数据库加载对象时,不会调用它。
返回值仅在 MapperExtension
链;父映射器的行为不会被此方法修改。
init_instance
(mapper, class_, oldinit, instance, args, kwargs)¶调用其构造函数时接收实例。
此方法仅在对象的userland构造期间调用。当从数据库加载对象时,不会调用它。
返回值仅在 MapperExtension
链;父映射器的行为不会被此方法修改。
instrument_class
(mapper, class_)¶在第一次构造映射器时接收类,并已将检测应用于映射类。
返回值仅在 MapperExtension
链;父映射器的行为不会被此方法修改。
reconstruct_instance
(mapper, instance)¶通过以下方式创建对象实例后接收该实例 __new__
以及在发生初始属性填充之后。
这通常发生在基于传入结果行创建实例时,并且在该实例的生存期内只调用一次。
请注意,在结果行加载过程中,将对为此实例接收的第一行调用此方法。请注意,根据结果行中存在的内容,某些属性和集合可能已加载,也可能未初始化。
返回值仅在 MapperExtension
链;父映射器的行为不会被此方法修改。
sqlalchemy.orm.interfaces.
SessionExtension
¶的基本实现 Session
事件钩子。
0.7 版后已移除: SessionExtension
已弃用,将在将来的版本中删除。请参考 event.listen()
与 SessionEvents
侦听器接口。
子类可以安装到 Session
(或) sessionmaker
)使用 extension
关键字参数:
from sqlalchemy.orm.interfaces import SessionExtension
class MySessionExtension(SessionExtension):
def before_commit(self, session):
print "before commit!"
Session = sessionmaker(extension=MySessionExtension())
相同的 SessionExtension
实例可用于任意数量的会话。
after_attach
(session, instance)¶在实例连接到会话后执行。
这是在添加、删除或合并之后调用的。
after_begin
(session, transaction, connection)¶在连接上开始事务后执行
transaction 是sessionTransaction。在连接上开始引擎级事务后调用此方法。
after_bulk_delete
(session, query, query_context, result)¶对会话执行批量删除操作后执行。
在session.query(…).delete()之后调用。
query 是调用此删除操作的查询对象。 query_context 是查询上下文对象。 result 是从批量操作返回的结果对象。
after_bulk_update
(session, query, query_context, result)¶对会话执行批量更新操作后执行。
这是在session.query(…).update()之后调用的。
query 是调用此更新操作的查询对象。 query_context 是查询上下文对象。 result 是从批量操作返回的结果对象。
after_commit
(session)¶在提交之后执行。
请注意,如果正在进行长时间运行的事务,这可能不是每次刷新。
after_flush
(session, flush_context)¶在刷新完成后但在调用提交之前执行。
请注意,会话的状态仍然处于预刷新状态,即“新”、"dirty"和“已删除”列表仍然显示预刷新状态以及实例属性的历史设置。
after_flush_postexec
(session, flush_context)¶在刷新完成后和执行后状态发生后执行。
这将在“新”、"dirty"和“已删除”列表处于最终状态时进行。实际的commit()可能已经发生,也可能没有发生,这取决于刷新是否启动了自己的事务或是否参与了更大的事务。
after_rollback
(session)¶发生回滚后执行。
请注意,如果正在进行长时间运行的事务,这可能不是每次刷新。
before_commit
(session)¶在调用提交之前立即执行。
请注意,如果正在进行长时间运行的事务,这可能不是每次刷新。
before_flush
(session, flush_context, instances)¶在刷新进程启动之前执行。
instances 是传递给 flush()
方法。
sqlalchemy.orm.interfaces.
AttributeExtension
¶的基本实现 AttributeImpl
事件挂钩,根据用户代码中的属性突变触发的事件。
0.7 版后已移除: AttributeExtension
已弃用,将在将来的版本中删除。请参考 event.listen()
与 AttributeEvents
侦听器接口。
AttributeExtension
用于侦听单个映射属性上的set、remove和append事件。它是在单个映射属性上建立的,使用 extension 参数,可用于 column_property()
, relationship()
及其他:
from sqlalchemy.orm.interfaces import AttributeExtension
from sqlalchemy.orm import mapper, relationship, column_property
class MyAttrExt(AttributeExtension):
def append(self, state, value, initiator):
print "append event !"
return value
def set(self, state, value, oldvalue, initiator):
print "set event !"
return value
mapper(SomeClass, sometable, properties={
'foo':column_property(sometable.c.foo, extension=MyAttrExt()),
'bar':relationship(Bar, extension=MyAttrExt())
})
请注意 AttributeExtension
方法 append()
和 set()
需要归还 value
参数。返回值用作有效值,并允许扩展更改最终持久化的内容。
attributeExtension组装在与映射类关联的描述符中。
active_history
= True¶指示set()方法希望接收“old”值,即使这意味着要激发懒惰的可调用文件。
注意 active_history
也可以通过直接设置 column_property()
和 relationship()
.
append
(state, value, initiator)¶接收集合追加事件。
返回值将用作要追加的实际值。
remove
(state, value, initiator)¶接收删除事件。
未定义返回值。
set
(state, value, oldvalue, initiator)¶接收设置事件。
返回值将用作要设置的实际值。