Форматирование SQL/ MySQL · PostgreSQL
Мгновенно форматируйте или сжимайте SQL-запросы. Поддержка MySQL, PostgreSQL и универсального SQL.
Этот инструмент решил вашу проблему?
Примеры кода
Python (sqlparse)
import sqlparse
sql = "select id,name from users where active=1"
# Format / beautify
formatted = sqlparse.format(
sql,
reindent=True,
keyword_case='upper',
identifier_case='lower',
strip_comments=False,
indent_width=2,
)
print(formatted)
# SELECT id, name
# FROM users
# WHERE active = 1
# Minify
minified = sqlparse.format(
sql,
strip_whitespace=True,
keyword_case='upper',
)Node.js (sql-formatter)
import { format } from 'sql-formatter';
const sql = `select id,name,email
from users where status='active'`;
// Format for MySQL
const formatted = format(sql, {
language: 'mysql',
tabWidth: 2,
keywordCase: 'upper',
linesBetweenQueries: 2,
});
// Format for PostgreSQL
const pgFormatted = format(sql, {
language: 'postgresql',
tabWidth: 2,
keywordCase: 'upper',
});
console.log(formatted);
// SELECT
// id,
// name,
// email
// FROM users
// WHERE status = 'active'CLI (pgFormatter)
# Install pgFormatter (Perl) # https://github.com/darold/pgFormatter cpanm pgFormatter # Format a file pg_format query.sql -o formatted.sql # Format from stdin echo "select * from users" | pg_format # Options pg_format query.sql --spaces 2 --keyword-case 1 --function-case 2 # Using prettier-plugin-sql (Node) npx prettier --plugin prettier-plugin-sql --parser sql query.sql
Go
package main
import (
"fmt"
"strings"
"unicode"
)
// Simple SQL keyword uppercaser
func formatSQL(sql string) string {
keywords := []string{
"SELECT", "FROM", "WHERE",
"JOIN", "LEFT JOIN", "INNER JOIN",
"GROUP BY", "ORDER BY", "HAVING",
"INSERT INTO", "VALUES", "UPDATE",
"SET", "DELETE FROM", "LIMIT",
}
result := sql
for _, kw := range keywords {
lower := strings.ToLower(kw)
result = strings.ReplaceAll(
result, lower,
"\n"+kw,
)
}
return strings.TrimSpace(result)
}
// For production use, consider:
// github.com/xwb1989/sqlparser (MySQL)
// github.com/pganalyze/pg_query_go (PostgreSQL)
func main() {
sql := "select id from users where id=1"
fmt.Println(formatSQL(sql))
}Часто задаваемые вопросы
Что такое форматирование / украшение SQL?
Форматирование SQL (украшение) преобразует компактный или непоследовательно написанный SQL-запрос в читаемую форму с единообразными отступами. Оно добавляет переносы строк перед основными предложениями (SELECT, FROM, WHERE, JOIN и т.д.) и переводит ключевые слова в верхний регистр. Это не меняет работу запроса — только его внешний вид.
Поддерживается ли синтаксис MySQL и PostgreSQL?
Форматировщик обрабатывает общий синтаксис SQL, используемый MySQL, PostgreSQL и большинством других СУБД. Специфичные для диалекта функции, такие как оператор приведения :: в PostgreSQL или идентификаторы в обратных кавычках в MySQL, корректно токенизируются. Выберите свой диалект, чтобы указать используемые синтаксические соглашения.
Для чего используется минификация SQL?
Минификация удаляет все лишние пробелы и комментарии для получения наиболее компактной формы запроса. Это полезно при встраивании SQL в строки кода, отправке SQL в логах или уменьшении многословности журналов запросов. Минифицированные запросы функционально идентичны отформатированным версиям.
Как отформатировать SQL-запросы из командной строки?
Для PostgreSQL используйте pg_format (Perl). Для MySQL используйте Python-пакет mysqlformat. Также можно использовать sqlparse в Python: import sqlparse; sqlparse.format(sql, reindent=True, keyword_case='upper'). Смотрите примеры кода ниже.
Почему мои комментарии удаляются после минификации?
Минификация намеренно удаляет комментарии SQL (-- однострочные и /* блочные */ комментарии) для уменьшения размера. Если вам нужно сохранить комментарии, используйте вместо этого режим форматирования, который сохраняет все комментарии и переформатирует их на правильном уровне отступов.
Может ли форматировщик обрабатывать CTE (предложения WITH)?
Да. Общие табличные выражения WITH ... AS (...) распознаются. Ключевое слово WITH начинает новый блок. Вложенные операторы SELECT внутри CTE также получают соответствующие отступы.