2017-07-06 5 views
1

私はsqlalchemy 1.0を使用します。 私のプロジェクトにはいくつかのモデルがあり、そのうちのいくつかは event.listen(Model, 'after_update', Model._after_update)のようなイベントリスナーを持っています。sqlalchemyイベントリスナーを無効にする方法

ユニットテストの場合、モデル/セッション/などのすべてのイベントリスナーを無効にする必要があります。

特定のテストが終了したら、すべてのリスナーを有効にする必要があります。

これを達成する方法はありますか?

+0

いくつかのグローバルフラグをチェックし、そのデコレータをすべてのイベントハンドラに適用するカスタム '@ disable_for_tests'デコレータを追加できます。 – univerio

+0

既存のコードを変更しないでください。 'Model.clear_event_handlers()'のようなものを使用したい: –

答えて

1

モデルのすべてのイベントリスナーをevent.registry._key_to_collectionから取得できます。それはキー(id(target), identifier, id(function))とdictです。その後、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) 
+0

素晴らしい!どうもありがとう :) –

関連する問題