Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Way to disable sqlalchemy event listeners

I use sqlalchemy 1.0. My project has several models, some of them have event listeners, like event.listen(Model, 'after_update', Model._after_update).

In case of unit-testing I need to disable all event listeners on model/session/etc.

When particular test finished I need to enable all listeners.

Is there any ways to achieve this?

like image 454
antonio_antuan Avatar asked Jul 06 '17 11:07

antonio_antuan


1 Answers

You can get all event listeners for model from event.registry._key_to_collection. It's a dict with keys (id(target), identifier, id(function)). Then remove them with 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)
like image 101
r-m-n Avatar answered Nov 08 '22 05:11

r-m-n