РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
616 of 711 menu

Событие after_begin

Событие after_begin относится к секции event и срабатывает после того, как соединение с базой данных начало новую транзакцию. Обработчик получает объект соединения conn, объект транзакции transaction и родительскую транзакцию parent. Это событие удобно использовать для логирования, настройки сессии или выполнения служебных запросов сразу после старта транзакции.

Синтаксис

from sqlalchemy import event event.listen(target, 'after_begin', fn)

Функция-обработчик принимает три аргумента: conn - соединение, transaction - начатая транзакция, parent - родительская транзакция или None.

Пример

Давайте зарегистрируем обработчик события after_begin на движке и посмотрим, когда он срабатывает:

from sqlalchemy import create_engine, event, text engine = create_engine('sqlite:///:memory:') @event.listens_for(engine, 'after_begin') def on_after_begin(conn, transaction, parent): print('transaction started') with engine.connect() as conn: conn.execute(text('SELECT 1'))

Результат выполнения кода:

"transaction started"

Пример

Давайте внутри обработчика выведем информацию о соединении и наличии родительской транзакции:

from sqlalchemy import create_engine, event, text engine = create_engine('sqlite:///:memory:') @event.listens_for(engine, 'after_begin') def on_after_begin(conn, transaction, parent): print('conn:', conn.engine.url) print('parent:', parent) with engine.connect() as conn: conn.execute(text('SELECT 1'))

Результат выполнения кода:

"conn: sqlite:///:memory:" "parent: None"

Пример

Давайте используем событие after_begin вместе с сессией, чтобы отследить старт транзакции при работе с моделью:

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) @event.listens_for(engine, 'after_begin') def on_after_begin(conn, transaction, parent): print('begin') with Session(engine) as session: session.add(Article(title='article')) session.commit()

Результат выполнения кода:

"begin" "begin"

Смотрите также

  • функцию listens_for,
    которая регистрирует обработчик события
  • функцию listen,
    которая подключает обработчик к цели
  • событие before_commit,
    которое срабатывает перед фиксацией транзакции
  • событие after_commit,
    которое срабатывает после фиксации транзакции
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить