SQLFluffをpre-commitで設定して、コミット時に自動でSQLを整形する

# 概要
この記事では、以下の内容についてまとめています. 

- SQLFluffの概要とインストール方法
- pre-commitのインストール方法
- コミット時に自動でSQL整形が走るようにする設定


## SQLFluffとは？

[SQLFluff](https://www.sqlfluff.com/)はSQLのLintツールです。
[dbt](https://www.getdbt.com/)を作っている会社が開発しました。
2022年4月現在ではバージョン0.13.xのオープンβです。

個人的には、
- mysqlやBigQueryなど、いろいろなdialectに対して適用できる
- コマンドラインからサクッと使えて便利　

といった面でいい感じだったので使っています。

### SQLFluffのインストール
Pyhton3系のpipで入れます。
(仮想環境やPATH等は個々人の好みでやってください。)


```
$ pip install sqlfluff
```

インストールできたら動作チェックとしてversionを確認しましょう。
```
$ sqlfluff version
sqlfluff, version 0.13.0
```



## pre-commitのインストール
pre-commitは、コミット時に型チェックやコード整形などpushする前の確認作業をローカルでサクッとできるので便利です。


まだインストールされてない場合はpipもしくはbrewで入れます。

```
$ pip install pre-commit
```
```
$ brew install pre-commit
```

インストールが終わったら、動作チェックとしてversionを確認しましょう。
```
$ pre-commit --version
pre-commit 2.18.1
```


## pre-commitにSQLFluffを設定し、自動でSQL整形する
まずgitが走るプロジェクトのルートフォルダに`.pre-commit-config.yaml`を作成します。

以下のようにコミット時にsqlfluffが走るように設定します。

```.pre-commit-config.yaml
repos:
- repo: https://github.com/sqlfluff/sqlfluff
  rev: 0.13.0
  hooks:
    - id: sqlfluff-lint
      args: [--dialect, mysql]
    - id: sqlfluff-fix
      args: [--dialect, mysql]
```


次に、pre-commitインストールをします
```
$ pre-commit install
pre-commit installed at .git/hooks/pre-commit
```
これで準備完了です。

### コミットして整形されるか試す
サンプルとして適当なSQLファイルをルートフォルダに作ります

```sample.sql
select
  column_1,
   column_2
      , column_3
from sample_table;
```
作成したファイルをaddしてcommitします。

```
$ git add sample.sql
$ git commit -m "test"
sqlfluff-lint............................................................Failed
- hook id: sqlfluff-lint
- exit code: 65

== [sample.sql] FAIL
L:   2 | P:   3 | L003 | Expected 1 indentations, found 0 [compared to line 01]
L:   3 | P:   4 | L003 | Expected 1 indentations, found 0 [compared to line 01]
L:   4 | P:   7 | L003 | Expected 2 indentations, found 1 [compared to line 01]
L:   4 | P:   7 | L019 | Found leading comma. Expected only trailing.
All Finished 📜 🎉!


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

==== finding fixable violations ====
== [sample.sql] FAIL
L:   2 | P:   3 | L003 | Expected 1 indentations, found 0 [compared to line 01]
L:   3 | P:   4 | L003 | Expected 1 indentations, found 0 [compared to line 01]
L:   4 | P:   7 | L003 | Expected 2 indentations, found 1 [compared to line 01]
L:   4 | P:   7 | L019 | Found leading comma. Expected only trailing.
==== fixing violations ====
4 fixable linting violations found
FORCE MODE: Attempting fixes...
Persisting Changes...
== [sample.sql] PASS
Done. Please check your files to confirm.
```

この時点で先程のサンプルのSQLファイルを確認すると
```sample.sql
select
    column_1,
    column_2,
    column_3
from sample_table;
```
いい感じになってますね！！
もう一度addしてコミットします。
```
$ git add sample.sql
$ git commit -m "test"

sqlfluff-lint............................................................Passed
sqlfluff-fix.............................................................Passed

 1 file changed, 3 insertions(+), 8 deletions(-)
```
無事コミットできました。


## 参考
https://docs.sqlfluff.com/en/stable/index.html
公式Docsです。

https://zenn.dev/takimo/articles/918a51c9bdd486
SQLFLuffの基本だけではなく、ルールのカスタムについても書かれています。`.sqlfluff`を設定するときにとても参考になります。