Событие connect
Событие connect из секции event срабатывает
в момент установки нового соединения с базой данных.
Обработчик получает объект соединения и может выполнить
дополнительную настройку: установить параметры сессии,
включить расширения СУБД или зарегистрировать
пользовательские функции.
Первым параметром обработчик принимает объект
DBAPIConnection - низкоуровневое соединение
драйвера базы данных. Через него можно получить курсор
и выполнить произвольные SQL-инструкции до того,
как соединение будет передано в пул.
Синтаксис
from sqlalchemy import event
@event.listens_for(engine, 'connect')
def on_connect(dbapi_connection, connection_record):
pass
Пример
Давайте зарегистрируем обработчик события connect
и включим поддержку внешних ключей в SQLite:
from sqlalchemy import create_engine, event
engine = create_engine('sqlite:///:memory:')
@event.listens_for(engine, 'connect')
def on_connect(dbapi_connection, connection_record):
cursor = dbapi_connection.cursor()
cursor.execute('PRAGMA foreign_keys=ON')
cursor.close()
with engine.connect() as conn:
res = conn.exec_driver_sql('PRAGMA foreign_keys')
print(res.fetchone())
Результат выполнения кода:
(1,)
Пример
Давайте проверим, что обработчик срабатывает при каждом новом соединении из пула:
Результат выполнения кода:
"new connection established"
Пример
Давайте зарегистрируем пользовательскую SQL-функцию при подключении к базе данных:
from sqlalchemy import create_engine, event
engine = create_engine('sqlite:///:memory:')
@event.listens_for(engine, 'connect')
def on_connect(dbapi_connection, connection_record):
dbapi_connection.create_function(
'to_upper',
1,
lambda value: value.upper() if value else value,
)
with engine.connect() as conn:
res = conn.exec_driver_sql("SELECT to_upper('article')")
print(res.fetchone())
Результат выполнения кода:
('ARTICLE',)
Смотрите также
-
декоратор
listens_for,
который регистрирует обработчик события -
функцию
listen,
которая подписывает функцию на событие -
событие
engine_connect,
которое срабатывает при подключении движка -
событие
first_connect,
которое срабатывает только при первом подключении