Событие first_connect
Событие first_connect из секции event
срабатывает, когда движок впервые устанавливает
соединение с базой данных. Оно вызывается только
один раз за время жизни движка. Первым параметром
обработчик принимает объект соединения DBAPIConnection,
вторым - запись о соединении ConnectionRecord.
Это событие удобно для инициализации сессии СУБД,
установки параметров подключения или создания
временных таблиц.
Синтаксис
from sqlalchemy import event
@event.listens_for(engine, 'first_connect')
def receive_first_connect(dbapi_connection, connection_record):
pass
Пример
Давайте зарегистрируем обработчик события
first_connect и выведем сообщение при первом
подключении к базе SQLite в памяти:
from sqlalchemy import create_engine, event, text
engine = create_engine('sqlite:///:memory:')
@event.listens_for(engine, 'first_connect')
def receive_first_connect(dbapi_connection, connection_record):
print('first_connect fired')
with engine.connect() as conn:
conn.execute(text('SELECT 1'))
Результат выполнения кода:
"first_connect fired"
Пример
Событие first_connect срабатывает только
один раз, даже если открыть несколько соединений.
Давайте убедимся в этом:
from sqlalchemy import create_engine, event, text
engine = create_engine('sqlite:///:memory:')
@event.listens_for(engine, 'first_connect')
def receive_first_connect(dbapi_connection, connection_record):
print('first_connect fired')
with engine.connect() as conn:
conn.execute(text('SELECT 1'))
with engine.connect() as conn:
conn.execute(text('SELECT 1'))
Результат выполнения кода:
"first_connect fired"
Пример
В обработчике first_connect можно выполнить
SQL-запрос для настройки соединения. Давайте
установим пользовательскую переменную SQLite:
from sqlalchemy import create_engine, event, text
engine = create_engine('sqlite:///:memory:')
@event.listens_for(engine, 'first_connect')
def receive_first_connect(dbapi_connection, connection_record):
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(res)
Результат выполнения кода:
"foreign_keys enabled"
"1"
Смотрите также
-
событие
connect,
которое срабатывает при каждом новом подключении -
событие
engine_connect,
которое вызывается при подключении через движок -
функцию
listens_for,
которая регистрирует обработчик события -
функцию
remove,
которая удаляет зарегистрированный обработчик