Функция event.remove
Функция event.remove удаляет обработчик
события, который был ранее зарегистрирован
через event.listen или
event.listens_for. Первым параметром
передается цель прослушивания (движок, класс
или метаданные). Вторым параметром - имя
события. Третьим параметром - функция-обработчик,
которую нужно удалить. Если обработчик не найден,
функция возвращает False, иначе - True.
Синтаксис
event.remove(target, identifier, fn)
Пример
Давайте создадим движок и подпишемся на событие
before_cursor_execute, а затем удалим
обработчик через event.remove:
from sqlalchemy import create_engine, event, text
engine = create_engine('sqlite:///:memory:')
def before_cursor_execute(conn, cursor, statement, parameters, context, executemany):
print('SQL:', statement)
event.listen(engine, 'before_cursor_execute', before_cursor_execute)
removed = event.remove(engine, 'before_cursor_execute', before_cursor_execute)
print('Removed:', removed)
with engine.connect() as conn:
conn.execute(text('SELECT 1'))
Результат выполнения кода:
"Removed: True"
Как видно, после удаления обработчика SQL-запрос не выводится в консоль.
Пример
Давайте попробуем удалить обработчик, который
не был зарегистрирован. Функция вернет
False:
from sqlalchemy import create_engine, event
engine = create_engine('sqlite:///:memory:')
def handler(conn, cursor, statement, parameters, context, executemany):
pass
res = event.remove(engine, 'before_cursor_execute', handler)
print(res)
Результат выполнения кода:
"False"
Пример
Давайте удалим обработчик события у класса
модели. Сначала зарегистрируем его через
event.listen, а затем удалим:
from sqlalchemy import create_engine, event
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
def before_insert(mapper, connection, target):
print('Inserting:', target.title)
event.listen(Article, 'before_insert', before_insert)
with Session(engine) as session:
session.add(Article(title='article'))
session.commit()
event.remove(Article, 'before_insert', before_insert)
with Session(engine) as session:
session.add(Article(title='article 2'))
session.commit()
Результат выполнения кода:
"Inserting: article"
После удаления обработчика вторая вставка не сопровождается выводом в консоль.
Смотрите также
-
функцию
listen,
которая регистрирует обработчик события -
функцию
listens_for,
которая регистрирует обработчик декоратором -
функцию
contains,
которая проверяет наличие обработчика -
событие
before_insert,
которое срабатывает перед вставкой объекта