Просмотр полных SQL-запросов с параметрами в SQLAlchemy
Быстрый ответ
Чтобы отобразить SQL-запрос, сгенерированный SQLAlchemy, конвертируйте объект запроса в строку:
print(str(query)) # Представление сгенерированного SQL-запроса
Если требуется увидеть запрос с конкретными значениями параметров, применяйте такой код:
print(query.statement.compile(compile_kwargs={"literal_binds": True}))
В результате получите полный SQL-скрипт с актуальными параметрами для более подробного анализа.
Основы анализа запросов
Понимание того, какой SQL-код генерирует SQLAlchemy вместо вас, может стать настоящим открытием при работе с базами данных. Давайте разберём все мельчайшие детали.
Отслеживание SQL-запросов в реальном времени для Flask приложений
Чтобы вести запись запросов в приложении Flask, просто активируйте следующую настройку:
app.config["SQLALCHEMY_ECHO"] = True # Flask будет выводить SQL-запросы
Таким образом, все SQL-запросы будут записываться в журнал приложения.
Настройка журналирования через echo
Для управления журналированием запросов на уровне механизма работы с базой данных:
engine = create_engine('postgresql://scott:tiger@localhost/', echo=True) # Каждый запрос будет контролироваться
engine.echo = not engine.echo # Регуляция "громкости" может быть полезной
Теперь вы можете при необходимости включать и выключать журналирование запросов.
Управление литералами с помощью StringLiteral
Для работы с литералами:
from sqlalchemy.sql.expression import StringLiteral
query = select([StringLiteral('some_value').label('column_name')]) # SQLAlchemy корректно обрабатывает литералы
Формирование полных запросов с помощью literalquery
Используйте literalquery
для создания полноценных SQL-запросов:
from sqlalchemy.sql import literal_column
from sqlalchemy.orm import Query
q = Query([literal_column("'text'"), literal_column("1")]) # Объединяем литерал и число в одном запросе
print(q) # Удивительное открытие того, что обычно скрыто от глаз
Визуализация
Сравним процесс отображения запроса, сформированного с помощью SQLAlchemy, с процессом проявления фотографий:
SQLAlchemy: 📸 (Сделан запрос)
Процесс проявления: 🧪🛁 (Формируется запрос)
Готовая фотография: 🖼️ (Актуальный SQL-запрос)
Воспользовавшись функцией str()
от SQLAlchemy, получаем SQL-выражение из объекта запроса:
query = session.query(MyModel).filter(MyModel.id == 123)
print(str(query)) # 📸 ➜ 🖼️ (Видим запрос в его подлинном виде)
Таким образом, перед нами наглядный и понятный SQL!
Погружение в детали анализа запросов
Поскольку мы уже заглянули за кулисы процесса формирования SQL, пойдём дальше и изучим механику создания SQL-запросов в SQLAlchemy.
Основы работы с литералами: знакомство с StringLiteral
Научимся управлять генерацией литералов в SQLAlchemy в соответствии с нашими требованиями:
StringLiteral('text').compile() # Вуаля, литералы на ладони!
Отладка SQL-кода при помощи LiteralDialect
С помощью LiteralDialect
можно внимательно рассмотреть сгенерированный SQL:
from sqlalchemy.sql import compiler
dialect = compiler.dialect()
compiled_query = query.statement.compile(dialect=dialect)
print(str(compiled_query)) # Наслаждайтесь элегантностью этих запросов!
Улучшаем читаемость вывода с pretty-printing
from prettyprinter import pprint
pprint(query) # Даже SQL-запросы могут быть эстетически приятными!
Диагностирование проблем через логирование запросов
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO) # Мы не боимся логов!
Искусство форматирования с помощью sqlparse
import sqlparse
formatted_query = sqlparse.format(str(query), reindent=True, keyword_case='upper')
print(formatted_query) # Ставим перед собой задачу: обеспечить удобство чтения SQL!
Полезные материалы
- Документация SQLAlchemy 1.4 о настройке движка поможет включить логирование запросов.
- Учебник по ORM SQLAlchemy для разработчиков на Python расскажет об основах работы с ORM и логированием запросов.
- В разделе о транзакциях и подключениях документации SQLAlchemy 1.4 вы узнаете больше о просмотре SQL-логов.
- На сайте pysheeet можно найти примеры работы с SQL-аналогами запросов в SQLAlchemy.
- API запросов в документации SQLAlchemy 1.4 поможет понять структуру запросов в этой ORM.
- Статья о создании связей между моделями данных подробно объяснит процесс перевода моделей ORM в SQL-запросы.