本节描述了基于类的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)¶接收设置事件。
返回值将用作要设置的实际值。