SQLをlintする SQLFluff に入門した
プロジェクトの中で SQL を使い ETL 処理を書いていたが、個人によって書き方にばらつきがあり、他人の SQL を確認したりメンテナンスするタイミングがとてもつらかった。 SQL もフォーマッタや linter を使って、少しでも作業しやすくしたいと思って探していたところ、SQL Fluff に出会うことができた。 今回は SQL Fluff に入門する!
インストールと確認
SQL Fluff は pip でインストールできる。
pip install sqlfluff
sqlfluff --version
で無事にインストールされていることを確認する。
2022/08/17 時点でのバージョンは1.2.1
となっていることがわかる。
sqlfluff, version 1.2.1
チュートリアル
チュートリアルに載っている SQL を lint してみる。
SELECT a+b AS foo, c AS bar from my_table
無事に lint が実行された!
$ sqlfluff lint test.sql --dialect ansi == [test.sql] FAIL L: 1 | P: 1 | L034 | Select wildcards then simple targets before calculations | and aggregates. L: 1 | P: 1 | L036 | Select targets should be on a new line unless there is | only one select target. L: 1 | P: 9 | L006 | Missing whitespace before + L: 1 | P: 9 | L006 | Missing whitespace after + L: 1 | P: 11 | L039 | Unnecessary whitespace found. L: 2 | P: 1 | L003 | Expected 1 indentations, found 0 [compared to line 01] L: 2 | P: 10 | L010 | Keywords must be consistently upper case. All Finished 📜 🎉!
DeepL で翻訳した結果も載せておく。
計算と集計の前にワイルドカードを選択し、次に単純なターゲットを選択します。 選択対象は、選択対象が1つでない限り、改行されるべきです。 の前に空白がない の後に空白がない 不要な空白が見つかりました。 1つのインデントが予想されますが、0が見つかりました[01行目と比較して]。 キーワードは一貫して大文字でなければなりません。
指摘事項を修正して、再度 lint してみる。
SELECT c AS bar, a + b AS foo FROM my_table
指摘されることがなく、無事に lint が通った!
$ sqlfluff lint test.sql --dialect ansi All Finished 📜 🎉!