Событие 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,
которое срабатывает после фиксации транзакции