👽

SQLFluffをpre-commitで自動化

2022/06/17に公開

はじめに

SQLのLintツールにSQLFluffというものがあります、コミット時に自動でLintをかけるためのpre-commitと組み合わせて実行させるための手順をまとめました。

pre-commitインストール&設定方法

pre-commitの公式の説明、手順はこちら
pipでインストールできます。

$ pip install pre-commit
$ pre-commit --version
pre-commit 2.19.0

設定ファイルを.pre-commit-config.yamlで作成します。
ファイルの内容は以下のように設定します。

repos:
- repo: https://github.com/sqlfluff/sqlfluff
  rev: 0.13.2
  hooks:
    - id: sqlfluff-lint
      args: [--dialect, bigquery]
    - id: sqlfluff-fix
      args: [--dialect, bigquery]

ファイルを作成したら設定をインストールします。

$ pre-commit install
pre-commit installed at .git/hooks/pre-commit

これでpre-commitの設定完了となります。

動作確認

サンプルのファイルとして以下のようなSQLファイルを作成します。

SELECT a+b  AS foo,
c AS bar from my_table

これをコミットして実際にLinterが実行されるか確認します。(初回実行時には環境のインストールが走るため時間がかかります。)

$ git add sample.sql
$ git commit -m "sample file commit"
[INFO] Initializing environment for https://github.com/sqlfluff/sqlfluff.
[INFO] Installing environment for https://github.com/sqlfluff/sqlfluff.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...
sqlfluff-lint............................................................Failed
- hook id: sqlfluff-lint
- exit code: 65

== [sample.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 📜 🎉!


sqlfluff-fix.............................................................Failed
- hook id: sqlfluff-fix
- files were modified by this hook

==== finding fixable violations ====
== [sample.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.
==== fixing violations ====
7 fixable linting violations found
FORCE MODE: Attempting fixes...
Persisting Changes...
== [sample.sql] PASS
Done. Please check your files to confirm.

これでファイルを確認すると以下のようにフィールドの順番、fromが大文字に変換、FROM句が改行されておりファイルが修正されています。

SELECT
    c AS bar,
    a + b AS foo
FROM my_table

いい感じに修正されているのでこの状態で再度コミットします。

$ git add .
$ git commit -m "commit"
sqlfluff-lint............................................................Passed
sqlfluff-fix.............................................................Passed
[main a5dac82] commit
 3 files changed, 13 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 .pre-commit-config.yaml
 create mode 100644 sample.sql

無事にコミットが成功しました。
今回は基本の設定にしましたが、SQLFluff自体にも設定ファイルを作成することで独自のルールを設定することができます。
設定方法はこちらをご覧ください。

参考)SQLFluffインストール&設定方法

pre-commitからのみの利用であれば個別にインストールする必要はありません。
SQLFluffの公式の説明、手順はこちら
こちらも同じくpipでインストールできます。

$ pip install sqlfluff
$ sqlfluff version
0.13.2

SQLFLuffの設定はひとまず完了です。

GitHubで編集を提案

Discussion