РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
620 of 711 menu

Событие before_cursor_execute

Событие before_cursor_execute срабатывает перед тем, как курсор базы данных выполнит SQL-запрос. Обработчик события принимает соединение, курсор, строку SQL-запроса и параметры запроса. Событие позволяет логировать запросы, замерять время их выполнения или модифицировать SQL перед отправкой в базу данных.

Первым параметром обработчик получает объект соединения conn, вторым - объект курсора cursor, третьим - строку SQL-запроса statement, четвертым - кортеж параметров parameters, пятым - контекст выполнения context, шестым - флаг executemany.

Синтаксис

from sqlalchemy import event @event.listens_for(engine, 'before_cursor_execute') def before_cursor_execute(conn, cursor, statement, parameters, context, executemany): pass

Пример

Давайте подпишемся на событие и выведем SQL-запрос перед его выполнением:

from sqlalchemy import create_engine, event, text engine = create_engine('sqlite:///:memory:') @event.listens_for(engine, 'before_cursor_execute') def before_cursor_execute(conn, cursor, statement, parameters, context, executemany): print(statement) with engine.connect() as conn: conn.execute(text('SELECT 1'))

Итоговый SQL запрос:

SELECT 1

Пример

Давайте замерим время выполнения каждого запроса с помощью события before_cursor_execute:

import time from sqlalchemy import create_engine, event, text engine = create_engine('sqlite:///:memory:') timings = {} @event.listens_for(engine, 'before_cursor_execute') def before_cursor_execute(conn, cursor, statement, parameters, context, executemany): conn.info['query_start_time'] = time.time() @event.listens_for(engine, 'after_cursor_execute') def after_cursor_execute(conn, cursor, statement, parameters, context, executemany): elapsed = time.time() - conn.info['query_start_time'] timings[statement] = elapsed with engine.connect() as conn: conn.execute(text('SELECT 1')) print(timings)

Результат выполнения кода:

{'SELECT 1': 0.000123456789}

Пример

Давайте будем записывать все выполненные запросы в список с помощью события before_cursor_execute:

from sqlalchemy import create_engine, event, text engine = create_engine('sqlite:///:memory:') queries = [] @event.listens_for(engine, 'before_cursor_execute') def before_cursor_execute(conn, cursor, statement, parameters, context, executemany): queries.append(statement) with engine.connect() as conn: conn.execute(text('SELECT 1')) conn.execute(text('SELECT 2')) print(queries)

Результат выполнения кода:

['SELECT 1', 'SELECT 2']

Смотрите также

  • событие after_cursor_execute,
    которое срабатывает после выполнения запроса
  • функцию listens_for,
    которая подписывает обработчик на событие
  • функцию listen,
    которая регистрирует обработчик события
  • функцию remove,
    которая удаляет обработчик события
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить