Событие after_cursor_execute
Событие after_cursor_execute из секции event
срабатывает после того, как SQL-запрос был передан
в курсор базы данных. Обработчик получает объект
соединения, курсор, текст запроса, параметры запроса,
признак множественного выполнения и контекст выполнения.
Событие удобно использовать для логирования запросов,
замера времени их выполнения и профилирования.
Синтаксис
from sqlalchemy import event
@event.listens_for(engine, 'after_cursor_execute')
def after_cursor_execute(conn, cursor, statement, parameters, context, executemany):
pass
Пример
Давайте зарегистрируем обработчик события
after_cursor_execute и выведем текст запроса
после его выполнения:
from sqlalchemy import create_engine, event, text
engine = create_engine('sqlite:///:memory:')
@event.listens_for(engine, 'after_cursor_execute')
def after_cursor_execute(conn, cursor, statement, parameters, context, executemany):
print('statement:', statement)
with engine.connect() as conn:
conn.execute(text('SELECT 1'))
Результат выполнения кода:
"statement: SELECT 1"
Пример
Давайте измерим время выполнения запроса с помощью
события after_cursor_execute:
from sqlalchemy import create_engine, event, text
engine = create_engine('sqlite:///:memory:')
@event.listens_for(engine, 'after_cursor_execute')
def after_cursor_execute(conn, cursor, statement, parameters, context, executemany):
print('executed:', statement)
with engine.connect() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)'))
conn.execute(text("INSERT INTO articles (title) VALUES ('article')"))
res = conn.execute(text('SELECT * FROM articles'))
for row in res:
print(row)
Результат выполнения кода:
"executed: CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)"
"executed: INSERT INTO articles (title) VALUES ('article')"
"executed: SELECT * FROM articles"
(1, 'article')
Пример
Давайте сохраним все выполненные запросы в список для дальнейшего анализа:
from sqlalchemy import create_engine, event, text
engine = create_engine('sqlite:///:memory:')
queries = []
@event.listens_for(engine, 'after_cursor_execute')
def after_cursor_execute(conn, cursor, statement, parameters, context, executemany):
queries.append(statement)
with engine.connect() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)'))
conn.execute(text("INSERT INTO articles (title) VALUES ('article')"))
print(queries)
Результат выполнения кода:
['CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)', "INSERT INTO articles (title) VALUES ('article')"]
Смотрите также
-
событие
before_cursor_execute,
которое срабатывает перед отправкой запроса в курсор -
функцию
listens_for,
которая регистрирует обработчик события -
функцию
listen,
которая подписывает функцию на событие -
функцию
remove,
которая удаляет обработчик события