禁用sqlalchemy事件侦听器的方法

时间:2017-07-06 11:38:59

标签: python unit-testing sqlalchemy

我使用sqlalchemy 1.0。 我的项目有几个模型,其中一些有事件监听器,比如 event.listen(Model, 'after_update', Model._after_update)

在单元测试的情况下,我需要在模型/会话/等上禁用所有事件监听器。

当特定测试结束时,我需要启用所有听众。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:1)

您可以从event.registry._key_to_collection获取模型的所有事件侦听器。这是一个带有键(id(target), identifier, id(function))的词典。然后使用event.remove删除它们。

import ctypes
from sqlalchemy import event

def clear_event_listeners(model):
    keys = [k for k in event.registry._key_to_collection if k[0] == id(model)]
    for key in keys:
        target = model
        identifier = key[1]
        fn = ctypes.cast(key[2], ctypes.py_object).value  # get function by id
        event.remove(target, identifier, fn)