我正在我的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