4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQLfluffをPJに取り入れてみるよ

Last updated at Posted at 2024-08-21

はじめに

私はSnowflakeを用いたデータ連携基盤を構築するPJに参画しています。
PJの振り返りからいくつか課題が出てきました。

SQLの書き方に関するルールについてもそのひとつです。

個性が出るSQLについて、PJ内で開発ルールを作成していたものの
メンバーそれぞれがルールを守っているだけで、ルールが正しく守られているのかの検証まで行っていませんでした。

ルールを作ったら検証するまでをセットで考えよう

PJの振り返りを通じて上司からもらったアドバイスです。
ルールを作って満足していましたが、きちんと検証してこそのルールだと感じたので
lintツールであるSQLfluffをPJに取り入れることにしました。

:gear: SQLfluffとは

lintツール(プログラムのエラーを検出してくれるツール)の1つです
お願いすれば修正(fix)までやってくれます

基本的な使い方

以下のドキュメントからルールを設定したファイル(.sqlfluff)を用意し
このファイルを基に対象ファイルのSQLを検証します

※右下からバージョンの確認をすること!

準備

2つのファイルを用意します

 1.設定ファイル .sqlfluff (コメントアウトは「#」)
 2.検証の対象ファイル xxx.sql

.sqlfluff
[sqlfluff]
  dialect = snowflake
  templater = raw
  max_line_length = 80
  exclude_rules = L042

[sqlfluff:layout:type:comma]
  spacing_after = single
  line_position = leading

[sqlfluff:rules:aliasing.table]
  aliasing = explicit

[sqlfluff:rules:aliasing.column]
  aliasing = explicit

[sqlfluff:rules:references.consistent]
  force_enable = true
sample_qiita.sql
SELECT id,firstname f_name,lastname l_name,age FROM
user U
LEFT JOIN
(SELECT id,name FROM
customer) ON U.id=id

設定ファイルはどんなルールに?

以下のルールで作成してみました。まずは最低限のルールにしています。

・SELECTする項目のカンマは前に
・エイリアス、修飾子を明示する
・サブクエリはWITH句にしない

使用したルールまとめ

Code Rule Rule
LT05 layout.long_lines 1行に何文字書くか(改行のタイミング)
ST05 structure.subquery サブクエリはWITH句に
LT04 layout.commas コンマの場所
AL01 aliasing.table テーブル名のエイリアス
AL02 aliasing.column カラム名のエイリアス
RF03 references.consistent 修飾子を付ける

いざ実践!

SQlfluffはCLIやVScodeから使う事が出来ます

まずはCLIからやってみる

※python、SQLfluffがインストールされていることを前提とする

1.SQLfluffがインストール出来ているか確認

PS C:\Users\Himeka_Kawaguchi> sqlfluff --version
sqlfluff, version 3.0.7

インストールしたSQlfluffのバージョンが表示されたらOK

2.対象のSQLファイルを検証

PS C:\Users\Himeka_Kawaguchi\repos\SQLfluff> sqlfluff lint <ファイル名>.sql

.sqlfluffsample_qiita.sqlが格納されているディレクトリのパスを指していること
※ディレクトリの移動は cd ディレクトリ名

3.lintした結果を確認する

実行するとこんな感じで色々言われます:smiling_imp:

image.png

対象ファイルのSQLについて何が問題かを教えてくれています。

▼読み方
L(行): 1 | P(位置): 1 | LT09(ルール) |Use 'COALESCE' instead of 'IFNULL'(理由、内容)

公式ドキュメントを上のルール名で検索すると詳細を確認することが出来ます。

※PowerShellだと背景色の関係で左側が読みづらい
(コマンドプロンプトだと少しわかりやすいかも...?)
image.png

※All Finishedに続く文字化けは絵文字なので問題なし(All Finished 📜 🎉!)

4.fix(修正)もしてみる

※同じファイル名で上書きされるので注意する

PS C:\Users\Himeka_Kawaguchi\repos\SQLfluff> sqlfluff fix qiita_sample.sql

実行結果

sample_qiita.sql
SELECT
    id
    , firstname AS f_name
    , lastname AS l_name
    , age
FROM
    user AS u
LEFT JOIN
    (
        SELECT
            id
            , name
        FROM
            customer
    ) ON u.id = id

設定したルールに沿って修正されていることが確認できました!

次はVScodeからも使ってみる

1.VScodeの拡張機能からsqlfluffをインストール

image.png

2.Executable-Pathを設定
 2-1.コマンドレットを開く(Ctrl+Shift+P)
 2-2.Preferences: Open Settingsを選択
image.png
 2-3.検索窓に「ExecutablePath」と入力
 2-4.Sqlfluff:ExecutablePathにPath★を入力 ※Path★について画像以下
image.png
 2-5.Path★はPowerShellで以下を実行した結果(Path)

PS C:\Users\Himeka_Kawaguchi\repos\SQLfluff> gcm sqlfluff | fl

3.対象ファイルにルールを適用
右クリック> Format Documentを選択し検証

image.png

結果は以下

image.png

※注意点

公式のドキュメントにはバージョンがあります。
画面右下から確認してください

image.png

まとめ

・PJを振り返り、改善点を見つけたら取り入れてみることは大事
・ルールを作ったら検証までセットで考える
・最初から完璧を求めすぎない

最後に

はじめての取り組みでしたが、やってみて良かったなと思います!
知らないだけで便利なツールは沢山あるなと知らされ、便利なもの、楽になるものはどんどん使っていくべきだと感じました。
PJを振り返り、より良いものになるような工夫はこれからも続けていきたいです。
参考になれば幸いです。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?