Событие after_configured
Событие after_configured принадлежит
пространству имен MapperEvents и срабатывает
один раз после того, как все мапперы в реестре
завершили свою настройку. Это событие не принимает
никаких аргументов и используется для выполнения
кода, который должен запуститься только после того,
как все модели и их связи были полностью
сконфигурированы.
В отличие от события before_configured, которое
срабатывает перед началом настройки мапперов,
событие after_configured гарантирует, что все
мапперы уже готовы к работе. Это делает его удобным
местом для регистрации дополнительных обработчиков,
построения индексов или выполнения отложенной
инициализации, зависящей от структуры моделей.
Событие подключается через декоратор event.listens_for
с указанием класса Mapper и строки
'after_configured'.
Синтаксис
from sqlalchemy import event
from sqlalchemy.orm import Mapper
@event.listens_for(Mapper, 'after_configured')
def receive_after_configured():
pass
Пример
Давайте создадим простую модель и повесим на событие
after_configured обработчик, который выведет
сообщение после завершения настройки:
from sqlalchemy import event
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Mapper
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
text: Mapped[str]
@event.listens_for(Mapper, 'after_configured')
def receive_after_configured():
print('All mappers configured')
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', text='some text')
session.add(article)
session.commit()
Результат выполнения кода:
"All mappers configured"
Пример
Событие after_configured удобно использовать
для сбора информации обо всех настроенных мапперах.
Давайте выведем список таблиц, зарегистрированных в
метаданных после конфигурации:
from sqlalchemy import event
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Mapper
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str]
@event.listens_for(Mapper, 'after_configured')
def receive_after_configured():
tables = sorted(Base.metadata.tables.keys())
print(tables)
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(title='article'))
session.add(User(name='user'))
session.commit()
Результат выполнения кода:
['articles', 'users']
Пример
Обработчик события after_configured можно
зарегистрировать несколько раз. Все обработчики будут
вызваны по очереди. Давайте убедимся в этом:
from sqlalchemy import event
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Mapper
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
status: Mapped[str]
@event.listens_for(Mapper, 'after_configured')
def first_handler():
print('First handler fired')
@event.listens_for(Mapper, 'after_configured')
def second_handler():
print('Second handler fired')
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(title='article', status='draft'))
session.commit()
Результат выполнения кода:
"First handler fired"
"Second handler fired"
Смотрите также
-
событие
before_configured,
которое срабатывает перед настройкой мапперов -
функцию
listens_for,
которая регистрирует обработчик события -
функцию
listen,
которая подключает слушателя к событию -
функцию
remove,
которая удаляет обработчик события