Просмотр полных SQL-запросов с параметрами в SQLAlchemy

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы отобразить SQL-запрос, сгенерированный SQLAlchemy, конвертируйте объект запроса в строку:

Python
Скопировать код
print(str(query))  # Представление сгенерированного SQL-запроса

Если требуется увидеть запрос с конкретными значениями параметров, применяйте такой код:

Python
Скопировать код
print(query.statement.compile(compile_kwargs={"literal_binds": True}))

В результате получите полный SQL-скрипт с актуальными параметрами для более подробного анализа.

Кинга Идем в IT: пошаговый план для смены профессии

Основы анализа запросов

Понимание того, какой SQL-код генерирует SQLAlchemy вместо вас, может стать настоящим открытием при работе с базами данных. Давайте разберём все мельчайшие детали.

Отслеживание SQL-запросов в реальном времени для Flask приложений

Чтобы вести запись запросов в приложении Flask, просто активируйте следующую настройку:

Python
Скопировать код
app.config["SQLALCHEMY_ECHO"] = True  # Flask будет выводить SQL-запросы

Таким образом, все SQL-запросы будут записываться в журнал приложения.

Настройка журналирования через echo

Для управления журналированием запросов на уровне механизма работы с базой данных:

Python
Скопировать код
engine = create_engine('postgresql://scott:tiger@localhost/', echo=True)  # Каждый запрос будет контролироваться
engine.echo = not engine.echo  # Регуляция "громкости" может быть полезной

Теперь вы можете при необходимости включать и выключать журналирование запросов.

Управление литералами с помощью StringLiteral

Для работы с литералами:

Python
Скопировать код
from sqlalchemy.sql.expression import StringLiteral
query = select([StringLiteral('some_value').label('column_name')])  # SQLAlchemy корректно обрабатывает литералы

Формирование полных запросов с помощью literalquery

Используйте literalquery для создания полноценных SQL-запросов:

Python
Скопировать код
from sqlalchemy.sql import literal_column
from sqlalchemy.orm import Query

q = Query([literal_column("'text'"), literal_column("1")])  # Объединяем литерал и число в одном запросе
print(q)  # Удивительное открытие того, что обычно скрыто от глаз

Визуализация

Сравним процесс отображения запроса, сформированного с помощью SQLAlchemy, с процессом проявления фотографий:

Markdown
Скопировать код
SQLAlchemy: 📸 (Сделан запрос)
Процесс проявления: 🧪🛁 (Формируется запрос)
Готовая фотография: 🖼️ (Актуальный SQL-запрос)

Воспользовавшись функцией str() от SQLAlchemy, получаем SQL-выражение из объекта запроса:

Python
Скопировать код
query = session.query(MyModel).filter(MyModel.id == 123)
print(str(query))  # 📸 ➜ 🖼️ (Видим запрос в его подлинном виде)

Таким образом, перед нами наглядный и понятный SQL!

Погружение в детали анализа запросов

Поскольку мы уже заглянули за кулисы процесса формирования SQL, пойдём дальше и изучим механику создания SQL-запросов в SQLAlchemy.

Основы работы с литералами: знакомство с StringLiteral

Научимся управлять генерацией литералов в SQLAlchemy в соответствии с нашими требованиями:

Python
Скопировать код
StringLiteral('text').compile()  # Вуаля, литералы на ладони!

Отладка SQL-кода при помощи LiteralDialect

С помощью LiteralDialect можно внимательно рассмотреть сгенерированный SQL:

Python
Скопировать код
from sqlalchemy.sql import compiler

dialect = compiler.dialect()
compiled_query = query.statement.compile(dialect=dialect)
print(str(compiled_query))  # Наслаждайтесь элегантностью этих запросов!

Улучшаем читаемость вывода с pretty-printing

Python
Скопировать код
from prettyprinter import pprint

pprint(query)  # Даже SQL-запросы могут быть эстетически приятными!

Диагностирование проблем через логирование запросов

Python
Скопировать код
import logging

logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)  # Мы не боимся логов!

Искусство форматирования с помощью sqlparse

Python
Скопировать код
import sqlparse

formatted_query = sqlparse.format(str(query), reindent=True, keyword_case='upper')
print(formatted_query)  # Ставим перед собой задачу: обеспечить удобство чтения SQL!

Полезные материалы

  1. Документация SQLAlchemy 1.4 о настройке движка поможет включить логирование запросов.
  2. Учебник по ORM SQLAlchemy для разработчиков на Python расскажет об основах работы с ORM и логированием запросов.
  3. В разделе о транзакциях и подключениях документации SQLAlchemy 1.4 вы узнаете больше о просмотре SQL-логов.
  4. На сайте pysheeet можно найти примеры работы с SQL-аналогами запросов в SQLAlchemy.
  5. API запросов в документации SQLAlchemy 1.4 поможет понять структуру запросов в этой ORM.
  6. Статья о создании связей между моделями данных подробно объяснит процесс перевода моделей ORM в SQL-запросы.