Блог
Русский

Форматирование SQL онлайн — красивые запросы с отступами

Форматирование SQL (MySQL, PostgreSQL и другие диалекты, регистр ключевых слов, отступы)

Работает в браузере · файлы никуда не загружаются

Регистр ключевых слов
Отступ

Отформатированный SQL

Что это за инструмент

Запрос, скопированный из лога или ORM, часто приходит одной длинной строкой или с беспорядочными отступами — такой трудно читать и ревьюить. Инструмент разбивает SQL на предложения SELECT, FROM, WHERE и т. д. и расставляет единообразные отступы. Результат обновляется по мере ввода.

Как пользоваться

  1. Вставьте SQL в поле ввода. Можно несколько операторов через точку с запятой.
  2. Выберите диалект вашей базы данных.
  3. Выберите ВЕРХНИЙ или нижний регистр ключевых слов либо оставьте как есть.
  4. Выберите отступ — 2 пробела, 4 пробела или табуляция — и скопируйте результат.

Как это работает

  • Форматирование выполняет библиотека с открытым кодом sql-formatter. Она разбивает ввод на токены, а затем расставляет переводы строк и отступы по глубине предложений и скобок.
  • Поддерживаемые диалекты: Standard SQL, MySQL, PostgreSQL, MariaDB, SQLite, BigQuery, Oracle (PL/SQL) и SQL Server (T-SQL). От диалекта зависит, как читаются кавычки идентификаторов (`, ", [ ]), маркеры параметров (?, $1, @name) и операторы.
  • Плейсхолдеры MyBatis #{id}, #{name,jdbcType=VARCHAR} и ${table} сохраняются как есть в любом диалекте. В MySQL # обычно начинает комментарий, но #{ считается плейсхолдером. Плейсхолдер, занимающий несколько строк, тоже сохраняется; вложенные фигурные скобки вроде #{list[${i}]} не поддерживаются.
  • Параметры привязки: ? и :name в Standard SQL, MySQL и MariaDB; $1 и :name в PostgreSQL; :name в Oracle; @name в SQL Server и BigQuery; SQLite принимает ?, ?1, :name, @name и $name.
  • В ошибке указываются строка, столбец и текст, на котором остановился разбор.
  • Настройка регистра касается только зарезервированных слов. Строковые литералы, комментарии и идентификаторы, включая имена таблиц и столбцов на кириллице, не меняются.
  • Вариант с табуляцией ставит один символ табуляции на уровень отступа.
  • Инструмент только переформатирует: он не выполняет запрос и не проверяет его смысл.

Примеры

Ввод:

select id, name from users where age > 20 and city = 'Москва' order by name

Результат (Standard SQL, верхний регистр, 2 пробела):

SELECT
  id,
  name
FROM
  users
WHERE
  age > 20
  AND city = 'Москва'
ORDER BY
  name

Частые вопросы

Мой запрос отправляется на сервер?

Нет. Форматирование выполняется в браузере библиотекой sql-formatter, запросы не передаются и не сохраняются. И все же не показывайте на общем экране запросы с настоящими паролями или персональными данными.

Какой диалект выбрать?

Тот, который соответствует вашей СУБД. Тогда синтаксис диалекта распознается правильно, например обратные кавычки MySQL, приведение типов `::` и параметры `$1` в PostgreSQL. Если не уверены, начните со Standard SQL.

Может ли форматирование изменить смысл запроса?

Меняются только пробелы, переводы строк и регистр ключевых слов. Строковые литералы, комментарии и идентификаторы сохраняют содержимое, а смена регистра никогда не затрагивает значения в кавычках, поэтому запрос работает так же.

Что делать, если выводится ошибка?

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

Не нашли нужный инструмент?