Release: 1.4.0b1 | Release Date: unreleased

SQLAlchemy 1.4 Documentation

已弃用的ORM事件接口

本节描述了基于类的ORM事件接口,它首先存在于sqlAlchemy 0.1中,在sqlAlchemy 0.5之前,它会随着更多类型的事件而发展。非ORM模拟在 不推荐使用的事件接口 .

0.7 版后已移除: 从SQLAlchemy 0.7开始,新的事件系统在 事件 替换扩展/代理/侦听器系统,为所有事件提供一致的接口,而不需要子类化。

映射事件

class 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 链;父映射器的行为不会被此方法修改。

会话事件

class 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() 方法。

属性事件

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

接收设置事件。

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

Previous: ORM例外 Next: ORM扩展