禁用 sqlalchemy 事件侦听器的方法

ant*_*uan 6 python unit-testing sqlalchemy

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

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

特定测试完成后,我需要启用所有侦听器。

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

r-m*_*m-n 6

您可以从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)
Run Code Online (Sandbox Code Playgroud)