SQL 格式化/ MySQL · PostgreSQL

一键美化或压缩 SQL 语句,支持 MySQL、PostgreSQL 及通用 SQL 语法。

模式:
方言:
缩进:
输入 SQL0 字符
格式化结果

这个工具有帮到你吗?

代码示例

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 语法吗?

格式化器处理 MySQL、PostgreSQL 及大多数关系型数据库共用的 SQL 语法。PostgreSQL 的 :: 类型转换运算符、MySQL 的反引号标识符等方言特有语法也能正确 tokenize。选择对应方言以标注你使用的语法规范。

SQL 压缩有什么用途?

压缩模式会移除所有多余空白和注释,生成最紧凑的查询格式。适合将 SQL 嵌入代码字符串、通过日志传输 SQL 或减少查询日志冗余。压缩后的 SQL 与格式化版本功能完全相同。

如何在命令行格式化 SQL?

PostgreSQL 可使用 pg_format(Perl)。MySQL 可使用 Python 的 mysqlformat 包。也可用 Python 的 sqlparse:import sqlparse; sqlparse.format(sql, reindent=True, keyword_case='upper')。详见下方代码示例。

为什么压缩后注释被删除了?

压缩模式会故意移除 SQL 注释(-- 单行注释和 /* 块注释 */)以减小体积。如需保留注释,请使用格式化模式,注释会按正确的缩进级别保留。

格式化器能处理 CTE(WITH 子句)吗?

可以。WITH ... AS (...) 公共表表达式可以被识别,WITH 关键字会触发新块的开始。CTE 内部的嵌套 SELECT 语句也会被适当缩进。