SQL评审别再因格式被打回用SQLFluff自动格式化CI里加一道格式卡点【免费下载链接】sqlfluffA modular SQL linter and auto-formatter with support for multiple dialects and templated code.项目地址: https://gitcode.com/GitHub_Trending/sq/sqlfluffPR被连续打回三次不是因为 bug是因为WHERE 后面多了个空格和JOIN 要不要换行。两个人两种风格评审半天全在扯格式。SQLFluff 是一个多方言的 SQL linter 和自动格式化工具它找出风格问题其中大部分能一键修好。它到底替你做了什么按方言解析报错带行号选对你的方言Postgres、Snowflake、MySQL 等问题逐条报出来还带 LT01 这样的规则号吵起来有据可查。大部分问题一键修复缩进、空格、关键字大小写sqlfluff fix一把梭你只 review diff。模板代码不白屏Jinja、dbt 模板先渲染再检查{% for %}不是盲区。流水线随便接标准命令行退出码pre-commit、CI 直接挂。以前要逐行人眼盯的排版问题现在它跑一遍 lint 就过完。三步跑起来1. 安装。Python 3.10 即可装上顺手写一行最丑的单行 SQL 做最小验证pip install sqlfluff echo select a b from t; test.sql sqlfluff lint test.sql --dialect ansi你会看到一串L: 1 | P: 5 | LT01格式的报错——行首空格、双空格、行尾没换行一次全揪出来。2. 修一次。对同一个文件跑sqlfluff fix test.sql对比前后改动前select a b from t;改动后select a b from t;空格齐了子句对齐了第一次看效果就在这一步。让它适配你的工作流统一SQL代码风格个人本地。在仓库根目录放一个.sqlfluff方言写一次以后不用再敲[sqlfluff] dialect postgres [sqlfluff:indentation] indented_joins Trueindented_joins什么时候开团队习惯JOIN 单独一行并缩进时就开默认是关的。团队仓库。挂一个 pre-commit 钩子它只检查你这次改动的文件不会全库跑repos: - repo: https://gitcode.com/GitHub_Trending/sq/sqlfluff rev: v4.3.0 hooks: - id: sqlfluff-fix只报错不动文件就把sqlfluff-fix换成sqlfluff-lint。CI 流水线。PR 流程里加一道卡点非零退出码直接挡住sqlfluff lint --dialect postgres .想做到 PR 里逐行标注看 docs/source/production/github_actions.rst。常用开关参数默认值什么时候改dialect不设运行时必填多方言仓库一定要写进配置max_line_length80跟随 dbt 规范团队行长限制更大时调到 100indented_joinsFalseJOIN 不缩进团队偏好 JOIN 换行时开fix_even_unparsableFalse不建议开有解析错误时先修错⚙️ 所有默认值在 src/sqlfluff/core/default_config.cfg 里都带注释可以直接读。踩过的坑 反直觉的行为1. fix 对某个文件没反应。现象跑了sqlfluff fix文件原样没动日志也没报错。原因对存在解析或模板错误的文件fix 默认跳过不动fix_even_unparsable为 False这是安全设计。怎么绕先sqlfluff lint把解析错误修掉再回来 fix 格式别随手开那个开关它有可能把你的 SQL 改坏。2. Jinja 大括号里一片安静。现象{% for %}循环里空格乱成一锅粥lint 却一片干净。原因ignore_templated_areas默认 True模板渲染出来的内容被当成不是你写的不检查。怎么绕.sqlfluff里把它设成 False模板也一起查。3. JOIN 被搬了80 列就折行。现象你看着没毛病的排版fix 完 JOIN 被挪回上一行、长行被折了。原因默认值跟随 dbt 风格指南——indented_joins为 Falsemax_line_length是 80。怎么绕这不是 bug在配置文件里覆盖这两个参数出来的就是你团队想要的样子。一个真实项目里的前后对比一段数仓查询的原始写法select a.user_id, b.order_id from users a left join orders b on a.user_idb.user_id where b.created_at2024-01-01;跑sqlfluff fix --dialect ansi之后select a.user_id, b.order_id from users a left join orders b on a.user_id b.user_id where b.created_at 2024-01-01 ;指标修复前修复后可读性子句随机断行要脑内重排一行一个子句扫一眼就懂评审耗时长一半时间在扯格式短只看逻辑新人上手慢得先问风格怎么定快照自动格式化的来就行什么时候不用它纯生成代码目录vendor/、generated/下的 .sql 全是产出的lint 它们只会产出一堆噪音直接写进.sqlfluffignore排除。团队有严格自定义风格且没人愿意改那它的默认规则对你只是噪音仓库里自带 plugins/sqlfluff-plugin-example/ 示例照它写自定义规则或者干脆继续用你们自己的工具。方言不在支持列表、或解析错误率很高先跑sqlfluff dialects确认支持情况再到 docs/source/reference/dialects.rst 看覆盖程度不支持就别硬上。带走这3句话方言写进.sqlfluff别每次靠命令行参数pre-commit 挂上sqlfluff-fix格式问题别出到提交外fix 跳过某个文件时先查它有没有解析错误配完这一套下次评审再被人挑空格你就可以笑笑不说话。【免费下载链接】sqlfluffA modular SQL linter and auto-formatter with support for multiple dialects and templated code.项目地址: https://gitcode.com/GitHub_Trending/sq/sqlfluff创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考