在数据库开发和数据分析的日常工作中,我们经常需要编写复杂的SQL查询语句。当SQL语句长度超过50行时,代码的可读性就会急剧下降。我曾经接手过一个长达300行的存储过程,因为没有合理格式化,光是理解它的逻辑就花了两天时间。
SQL格式化工具通过以下方式提升工作效率:
SQLFormat(https://sqlformat.org/)是我最常用的在线工具:
注意:涉及敏感数据的SQL不要使用在线工具,建议使用本地客户端
VS Code的SQL Formatter插件:
bash复制# 安装命令
code --install-extension adpyke.vscode-sql-formatter
优势:
对于CI/CD流水线,我推荐sqlparse:
python复制# 安装
pip install sqlparse
# 使用示例
sqlparse -r -k upper -i 4 input.sql > output.sql
参数说明:
-r 保留注释-k upper 关键字大写-i 4 4空格缩进对于包含多个CTE的查询,建议这样排版:
sql复制WITH
users AS (
SELECT id, name
FROM user_table
WHERE status = 'active'
),
orders AS (
SELECT user_id, amount
FROM order_table
WHERE created_at > CURRENT_DATE - INTERVAL '30 days'
)
SELECT
u.name,
COUNT(o.*) AS order_count,
SUM(o.amount) AS total_amount
FROM
users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY
u.name
ORDER BY
total_amount DESC;
创建.sqlformatterrc配置文件:
json复制{
"language": "PostgreSQL",
"indent": " ",
"keywordCase": "upper",
"stripComments": false,
"linesBetweenQueries": 2
}
可能原因:
解决方法:
sql复制-- formatter:off
CREATE OR REPLACE FUNCTION custom_func()...
-- formatter:on
建议在项目中添加:
Git预提交钩子示例:
bash复制#!/bin/sh
staged_sql=$(git diff --cached --name-only --diff-filter=ACM | grep '\.sql$')
[ -z "$staged_sql" ] && exit 0
echo "Formatting SQL files..."
sqlformat -r -k upper -i 4 -o $staged_sql $staged_sql
git add $staged_sql
对于超大型SQL文件(>10MB):
我常用的性能测试命令:
bash复制time sqlformat -r huge_query.sql > /dev/null
当处理时间超过5秒时,建议考虑: