本节描述了最初存在于SQLAlchemy 0.1中的基于类的ORM事件接口,该接口在SQLAlchemy 0.5之前有更多类型的事件。非ORM模拟在Deprecated Event Interfaces中描述。
从版本0.7开始弃用:从SQLAlchemy 0.7开始,Events中描述的新事件系统取代了扩展/代理/侦听器系统,为所有不需要的事件提供一致的接口用于子类化。
sqlalchemy.orm.interfaces。
MapperExtension
¶Mapper
事件挂钩的基本实现。
注意
新的扩展类是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 ) ¶ T6>在该实例被删除后接收对象实例。
返回值仅在MapperExtension
链中有效;父映射器的行为不会被此方法修改。
after_insert
(mapper, connection, instance)¶在插入实例后接收对象实例。
返回值仅在MapperExtension
链中有效;父映射器的行为不会被此方法修改。
after_update
( mapper,连接,实例 ) ¶ T6>在实例更新后接收对象实例。
返回值仅在MapperExtension
链中有效;父映射器的行为不会被此方法修改。
before_delete
(mapper, connection, instance)¶在该实例被删除之前接收一个对象实例。
请注意,可以在此处设置no更改整体刷新计划;并且对Session
的操纵不会产生预期的效果。要操作扩展中的Session
,请使用SessionExtension
。
返回值仅在MapperExtension
链中有效;父映射器的行为不会被此方法修改。
before_insert
( mapper,连接,实例 ) ¶ T6>在该实例插入其表中之前接收一个对象实例。
这是设置主键值以及不以其他方式处理的好地方。
可以在此方法内修改基于列的属性,这将导致插入新值。However no changes to the overall flush plan can be made, and manipulation of the Session
will not have the desired effect. 要操作扩展中的Session
,请使用SessionExtension
。
返回值仅在MapperExtension
链中有效;父映射器的行为不会被此方法修改。
before_update
( mapper,connection,instance ) ¶ T6>在实例更新之前接收对象实例。
请注意,为所有标记为“脏”的实例调用此方法,即使这些实例没有对其基于列的属性进行净更改。当一个对象的任何基于列的属性有一个被调用的“set attribute”操作或当它的任何集合被修改时,这个对象被标记为脏。如果在更新时没有基于列的属性有任何净更改,则不会发布UPDATE语句。这意味着发送到before_update的实例不是保证会发出UPDATE语句(尽管您可以在此处影响结果)。
要检测对象上的基于列的属性是否具有净更改,并因此会生成UPDATE语句,请使用object_session(instance).is_modified(instance, include_collections = False) T2> T0>。
可以在此方法中修改基于列的属性,这将导致更新新值。However no changes to the overall flush plan can be made, and manipulation of the Session
will not have the desired effect. 要操作扩展中的Session
,请使用SessionExtension
。
返回值仅在MapperExtension
链中有效;父映射器的行为不会被此方法修改。
init_failed
( mapper,class _,oldinit,实例 t5 >,args,kwargs ) ¶当它的构造函数被调用时接收一个实例,并引发异常。
该方法仅在对象的用户区构造期间被调用。从数据库加载对象时不会调用它。
返回值仅在MapperExtension
链中有效;父映射器的行为不会被此方法修改。
init_instance
(mapper, class_, oldinit, instance, args, kwargs)¶当它的构造函数被调用时接收一个实例。
该方法仅在对象的用户区构造期间被调用。从数据库加载对象时不会调用它。
返回值仅在MapperExtension
链中有效;父映射器的行为不会被此方法修改。
instrument_class
(mapper, class_)¶首次构建映射器时接收类,并将映射应用到映射类。
返回值仅在MapperExtension
链中有效;父映射器的行为不会被此方法修改。
reconstruct_instance
(mapper, instance)¶通过__new__
创建对象实例后,并在初始属性填充发生后接收对象实例。
这通常在基于传入结果行创建实例时发生,并且在该实例的生存期中仅调用一次。
请注意,在结果行加载期间,在为此实例接收的第一行调用此方法。请注意,根据结果行中的内容,某些属性和集合可能被加载,甚至可能不被加载或甚至被初始化。
返回值仅在MapperExtension
链中有效;父映射器的行为不会被此方法修改。
sqlalchemy.orm.interfaces。
SessionExtension
¶Session
事件挂钩的基本实现。
注意
SessionExtension
is deprecated. 请参阅event.listen()
以及SessionEvents
。
可以使用extension
关键字参数将子类安装到Session
(或sessionmaker
)中:
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 is the SessionTransaction. 在连接上启动引擎级事务之后调用此方法。
after_bulk_delete
( 会话,查询,query_context,结果 t5 > ) T6> ¶ T7>对会话进行批量删除操作后执行。
这是在session.query(...)。delete()之后调用的。
query是调用此删除操作的查询对象。query_context was the query context object. 结果是批量操作返回的结果对象。
after_bulk_update
( 会话,查询,query_context,结果 t5 > ) T6> ¶ T7>在批量更新操作后执行会话。
这是在session.query(...)。update()之后调用的。
query是调用此更新操作的查询对象。query_context was the query context object. 结果是批量操作返回的结果对象。
after_commit T0> ( T1> 会话 T2> ) T3> ¶ T4>
在提交发生后执行。
请注意,如果长时间运行的事务正在进行,这可能不是每次刷新。
after_flush
( session,flush_context ) ¶刷新完成后执行,但在调用提交之前执行。
请注意,会话的状态仍处于预先刷新状态,即“新建”,“脏”和“已删除”列表仍显示预刷新状态以及实例属性的历史记录设置。
after_flush_postexec
( session,flush_context ) 刷新完成后以及执行后状态发生后执行。
这将是'新','脏'和'删除'列表处于最终状态的时候。实际提交()可能发生也可能没有发生,具体取决于flush是否开始自己的事务或参与更大的事务。
after_rollback T0> ( T1> 会话 T2> ) T3> ¶ T4>
发生回滚后执行。
请注意,如果长时间运行的事务正在进行,这可能不是每次刷新。
before_commit T0> ( T1> 会话 T2> ) T3> ¶ T4>
在调用commit之前执行。
请注意,如果长时间运行的事务正在进行,这可能不是每次刷新。
before_flush T0> ( T1> 会话 T2>, flush_context T3>,实例 T4> ) T5> ¶ T6>
在刷新过程开始之前执行。
实例是传递给flush()
方法的对象的可选列表。
sqlalchemy.orm.interfaces。
AttributeExtension
¶AttributeImpl
事件挂钩的基本实现,这是在用户代码中引发属性突变时触发的事件。
注意
AttributeExtension
用于侦听设置,删除和追加单个映射属性上的事件。它使用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()方法想要接收'旧'值,即使它意味着释放懒惰的可调参数。
请注意,active_history
也可以直接通过column_property()
和relationship()
设置。
append
(state, value, initiator)¶收到追加追加事件。
返回值将被用作要追加的实际值。
删除
( 状态,值,发起人 ) ¶ T6>收到移除事件。
没有定义返回值。
set
(state, value, oldvalue, initiator)¶收到设定的事件。
返回的值将用作要设置的实际值。