SQLFluff

一、SQLFluff 是什么?

SQLFluff 是一个​​开源的 SQL 代码质量工具​​,专注于通过自动化方式提升 SQL 代码的可读性、一致性和规范性。其核心功能包括:

  1. ​代码格式化​:自动调整缩进、空格、换行等格式问题,支持多种 SQL 方言(如 ANSI、PostgreSQL、Snowflake 等)。
  2. ​语法检查​:检测代码中的语法错误、命名规范问题(如表名/字段名是否符合规范)。
  3. ​规则定制​:允许用户通过配置文件自定义规则,适配团队或项目的编码标准。
  4. ​与开发工具集成​:支持 VS Code 扩展、dbt/Jinja 模板引擎,可嵌入 CI/CD 流程实现自动化检查。
适用场景
  • ​团队协作​:统一多人开发的 SQL 代码风格,减少合并冲突。
  • ​代码审查​:在数据工程、数据分析流程中提前发现潜在问题。
  • ​遗留代码重构​:快速规范化历史 SQL 脚本,提升可维护性。

二、基础教程

1. 安装与初始化
复制代码
# 安装 SQLFluff(Python 环境需 ≥3.6)
pip install sqlfluff

# 初始化配置文件(生成 .sqlfluff)
sqlfluff init
2. 核心命令
命令 功能说明 示例
sqlfluff lint 检查 SQL 文件的规范问题 sqlfluff lint query.sql
sqlfluff fix 自动修复可修正的格式问题 sqlfluff fix query.sql
sqlfluff parse 解析 SQL 并生成抽象语法树(AST) sqlfluff parse query.sql
3. 配置文件示例(.sqlfluff
复制代码
[sqlfluff]
dialect = postgres  # 指定 SQL 方言
exclude_rules = L003, L009  # 排除特定规则

[sqlfluff:rules]
capitalisation_policy = lower  # 关键字小写
indent_size = 4                # 缩进4空格
max_line_length = 120          # 最大行宽
4. 快速上手示例

​原始代码(test.sql)​

复制代码
SELECT a+b AS foo,c AS bar FROM my_table

​检查问题​

复制代码
sqlfluff lint test.sql --dialect postgres

输出:

复制代码
== [test.sql] FAIL
L:   1 | P:   8 | LT01 | Expected only single space before 'AS' keyword
L:   1 | P:  11 | LT02 | First line should not be indented

​自动修复​

复制代码
sqlfluff fix test.sql --dialect postgres

修复后代码:

复制代码
SELECT
    a + b AS foo,
    c AS bar
FROM my_table

三、进阶功能

  1. ​多方言支持​

    通过 --dialect 参数切换数据库类型(如 bigquerysnowflake),适配不同平台的语法差异。

  2. ​与 dbt 集成​

    在 dbt 项目中直接运行 SQLFluff,检查模型文件中的 SQL 代码:

    复制代码
    dbt lint --sqlfluff
  3. ​自定义规则开发​

    可通过编写 Python 插件扩展规则,例如禁止使用特定函数:

    复制代码
    # 自定义规则示例(需放置于 .sqlfluff/rules 目录)
    from sqlfluff.core.rules import BaseRule
    
    class NoSelectStarRule(BaseRule):
        def _eval(self, segment, parent_stack):
            if segment.name == 'select_statement':
                if ' * ' in segment.raw:
                    return LintResult(anchor=segment, description="禁止使用 SELECT *")

四、生产环境建议

  • ​CI/CD 集成​:在 GitHub Actions 或 Jenkins 中添加 SQLFluff 检查步骤,阻止不规范代码合并。
  • ​团队规范文档​ :将 .sqlfluff 配置文件纳入版本控制,确保全员遵循统一标准。
  • ​定期重构​ :结合 sqlfluff lint --recursive 批量检查历史代码库。

通过本教程,您可以快速掌握 SQLFluff 的核心功能。如需深入规则定制或高级用法,可参考 官方网页