如何检查SQLAlchemy中是否存在事件侦听器?

时间:2013-12-31 22:21:55

标签: python session sqlalchemy versioning

我正在我的SQLAlchemy映射类中实现版本控制,遵循示例代码here

这是versioned_session函数,我在我创建的每个会话中调用它:

def versioned_session(session):
    @event.listens_for(session, 'before_flush')
    def before_flush(session, flush_context, instances):
        for obj in versioned_objects(session.dirty):
            create_version(obj, session)
        for obj in versioned_objects(session.deleted):
            create_version(obj, session, deleted=True)

我的版本操作大部分都在工作,除非我刷新更改。在我的应用程序中,创建会话时,会为会话分配before_flush事件侦听器。由于我使用的是scoped_session,因此应用程序似乎重用了同一个会话,但是当它已经存在时仍会添加事件监听器。这导致每次单次刷新即将发生时,创建相同对象的大约20个新版本。 有没有办法让我有条件地注册事件监听器,只有当它还不存在时?

目前,我通过添加自定义_has_versioning_listener标志来使用解决方法。我觉得添加自己的旗帜不一定是必要的。

def versioned_session(session):
    if not getattr(session, '_has_versioning_listener', False):
        @event.listens_for(session, 'before_flush')
        def before_flush(session, flush_context, instances):
            for obj in versioned_objects(session.dirty):
                create_version(obj, session)
            for obj in versioned_objects(session.deleted):
                create_version(obj, session, deleted=True)
        session._has_versioning_listener = True

0 个答案:

没有答案