Событие checkin
Событие checkin относится к событиям пула соединений
и срабатывает в момент, когда соединение возвращается
обратно в пул после завершения работы с ним. Событие
принимает первым параметром объект dbapi_connection,
который представляет собой соединение на уровне DBAPI,
а вторым параметром - объект connection_record,
который хранит информацию о данном соединении в пуле.
Событие полезно для логирования, аудита и сброса состояния
соединения перед его повторным использованием.
Синтаксис
from sqlalchemy import event
event.listen(pool, 'checkin', fn)
Здесь pool - это объект пула соединений,
полученный через engine.pool,
'checkin' - имя события,
а fn - функция-обработчик, которая принимает
dbapi_connection и connection_record.
Пример
Давайте создадим движок и подпишемся на событие
checkin, чтобы отследить возврат соединения в пул:
from sqlalchemy import create_engine, event, text
engine = create_engine('sqlite:///:memory:')
@event.listens_for(engine.pool, 'checkin')
def on_checkin(dbapi_connection, connection_record):
print('connection returned to pool')
with engine.connect() as conn:
conn.execute(text('SELECT 1'))
Результат выполнения кода:
"connection returned to pool"
Пример
Давайте используем событие checkin для сброса
пользовательской переменной соединения перед возвратом
в пул:
from sqlalchemy import create_engine, event, text
engine = create_engine('sqlite:///:memory:')
@event.listens_for(engine.pool, 'checkin')
def reset_state(dbapi_connection, connection_record):
cursor = dbapi_connection.cursor()
cursor.execute('PRAGMA user_version = 0')
cursor.close()
print('state reset')
with engine.connect() as conn:
conn.execute(text('SELECT 1'))
Результат выполнения кода:
"state reset"
Пример
Давайте выведем идентификатор соединения при его
возврате в пул через атрибут connection_record:
from sqlalchemy import create_engine, event, text
engine = create_engine('sqlite:///:memory:')
@event.listens_for(engine.pool, 'checkin')
def log_checkin(dbapi_connection, connection_record):
print('checked in record:', id(connection_record))
with engine.connect() as conn:
conn.execute(text('SELECT 1'))
Результат выполнения кода:
"checked in record: 140234567890123"
Смотрите также
-
событие
checkout,
которое срабатывает при извлечении соединения из пула -
событие
connect,
которое срабатывает при создании нового соединения -
событие
engine_connect,
которое срабатывает при подключении движка -
функцию
listens_for,
которая подписывает обработчик на событие