版本:1.1.0b2 |发布日期:2016年7月1日

SQLAlchemy 1.1文档

不推荐使用的ORM事件接口

本节描述了最初存在于SQLAlchemy 0.1中的基于类的ORM事件接口,该接口在SQLAlchemy 0.5之前有更多类型的事件。非ORM模拟在Deprecated Event Interfaces中描述。

从版本0.7开始弃用:从SQLAlchemy 0.7开始,Events中描述的新事件系统取代了扩展/代理/侦听器系统,为所有不需要的事件提供一致的接口用于子类化。

Mapper事件

class sqlalchemy.orm.interfaces。 MapperExtension

Mapper事件挂钩的基本实现。

注意

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 mapperconnectioninstance ¶ 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 mapperconnectioninstance ¶ 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 mapperclass _oldinit实例 t5 >,argskwargs

当它的构造函数被调用时接收一个实例,并引发异常。

该方法仅在对象的用户区构造期间被调用。从数据库加载对象时不会调用它。

返回值仅在MapperExtension链中有效;父映射器的行为不会被此方法修改。

init_instance(mapper, class_, oldinit, instance, args, kwargs)

当它的构造函数被调用时接收一个实例。

该方法仅在对象的用户区构造期间被调用。从数据库加载对象时不会调用它。

返回值仅在MapperExtension链中有效;父映射器的行为不会被此方法修改。

instrument_class(mapper, class_)

首次构建映射器时接收类,并将映射应用到映射类。

返回值仅在MapperExtension链中有效;父映射器的行为不会被此方法修改。

reconstruct_instance(mapper, instance)

通过__new__创建对象实例后,并在初始属性填充发生后接收对象实例。

这通常在基于传入结果行创建实例时发生,并且在该实例的生存期中仅调用一次。

请注意,在结果行加载期间,在为此实例接收的第一行调用此方法。请注意,根据结果行中的内容,某些属性和集合可能被加载,甚至可能不被加载或甚至被初始化。

返回值仅在MapperExtension链中有效;父映射器的行为不会被此方法修改。

会话事件

class 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 sessioninstance

在实例连接到会话后执行。

这是在添加,删除或合并之后调用的。

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 sessionflush_context

刷新完成后执行,但在调用提交之前执行。

请注意,会话的状态仍处于预先刷新状态,即“新建”,“脏”和“已删除”列表仍显示预刷新状态以及实例属性的历史记录设置。

after_flush_postexec sessionflush_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()方法的对象的可选列表。

属性事件

class sqlalchemy.orm.interfaces。 AttributeExtension

AttributeImpl事件挂钩的基本实现,这是在用户代码中引发属性突变时触发的事件。

注意

AttributeExtension已弃用。请参阅event.listen()以及AttributeEvents

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)

收到设定的事件。

返回的值将用作要设置的实际值。