よしたく blog

ほぼ週刊で記事を書いています

SQLをlintする SQLFluff に入門した

プロジェクトの中で SQL を使い ETL 処理を書いていたが、個人によって書き方にばらつきがあり、他人の SQL を確認したりメンテナンスするタイミングがとてもつらかった。 SQL もフォーマッタや linter を使って、少しでも作業しやすくしたいと思って探していたところ、SQL Fluff に出会うことができた。 今回は SQL Fluff に入門する!

docs.sqlfluff.com

インストールと確認

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 📜 🎉!