Событие checkout
Событие checkout срабатывает в момент,
когда соединение извлекается из пула
соединений движка. Оно позволяет
перехватить момент выдачи соединения
и выполнить дополнительные действия,
например, настроить сессию СУБД или
сбросить состояние. Событие принимает
параметры dbapi_connection,
connection_record и
connection_proxy.
Синтаксис
from sqlalchemy import event
@event.listens_for(engine, 'checkout')
def on_checkout(dbapi_connection, connection_record, connection_proxy):
pass
Пример
Давайте создадим движок и подпишемся
на событие checkout, чтобы
убедиться, что соединение извлекается
из пула при выполнении запроса:
from sqlalchemy import create_engine, event, text
engine = create_engine('sqlite:///:memory:')
@event.listens_for(engine, 'checkout')
def on_checkout(dbapi_connection, connection_record, connection_proxy):
print('Connection checked out from pool')
with engine.connect() as conn:
conn.execute(text('SELECT 1'))
Результат выполнения кода:
"Connection checked out from pool"
Пример
Давайте проверим, что событие
checkout срабатывает только
при фактическом извлечении соединения
из пула, а не при каждом обращении
к движку:
from sqlalchemy import create_engine, event, text
engine = create_engine('sqlite:///:memory:')
checkout_count = 0
@event.listens_for(engine, 'checkout')
def on_checkout(dbapi_connection, connection_record, connection_proxy):
global checkout_count
checkout_count += 1
print(f'Checkout number: {checkout_count}')
with engine.connect() as conn:
conn.execute(text('SELECT 1'))
conn.execute(text('SELECT 2'))
with engine.connect() as conn:
conn.execute(text('SELECT 3'))
print(f'Total checkouts: {checkout_count}')
Результат выполнения кода:
"Checkout number: 1"
"Checkout number: 2"
"Total checkouts: 2"
Пример
Давайте используем событие
checkout для настройки
соединения, например, включим
режим внешних ключей в SQLite:
from sqlalchemy import create_engine, event, text
engine = create_engine('sqlite:///:memory:')
@event.listens_for(engine, 'checkout')
def on_checkout(dbapi_connection, connection_record, connection_proxy):
cursor = dbapi_connection.cursor()
cursor.execute('PRAGMA foreign_keys=ON')
cursor.close()
print('Foreign keys enabled')
with engine.connect() as conn:
res = conn.execute(text('PRAGMA foreign_keys')).scalar()
print(f'Foreign keys: {res}')
Результат выполнения кода:
"Foreign keys enabled"
"Foreign keys: 1"
Смотрите также
-
событие
checkin,
которое срабатывает при возврате соединения в пул -
событие
connect,
которое срабатывает при создании нового соединения -
событие
first_connect,
которое срабатывает при первом подключении к базе -
функцию
listens_for,
которая регистрирует обработчик события