Traffine I/O

日本語

2023-03-12

SQLFluff

SQLFluffとは

SQLFluffは、SQLのフォーマットの問題を自動的に特定し修正するオープンソースソフトウェア(OSS)です。さまざまなSQL方言(文法)をサポートしており、多様なSQL環境で効果的かつ柔軟なツールとなっています。

公式のGitHubリポジトリからSQLFluffと最新のアップデートにアクセスできます。

https://github.com/sqlfluff/sqlfluff

他の言語とは異なり、SQLには特定のライティングのガイドラインがあまりありません。しかし、セールス担当やマーケティング担当などのIT以外のプロフェッショナルがデータ分析のためにSQLを書く傾向が急速に増加しています。データ分析のためにSQLを使用する人々がますます増えるにつれて、生成されるSQLクエリのスタイルは大きく異なるものになります。SQLクエリの書き方を半ば強制的に統一するためにSQLFluffを使用することは、標準を維持しデータ分析の効率を向上させるための良い試みとされます。

インストール

SQLFluffをインストールするには、システムにPython3がインストールされている必要があります。

Pythonのパッケージマネージャであるpipを使用してSQLFluffをインストールします。次のコマンドを入力します。

bash
$ pip3 install sqlfluff

SQLFluffの使用方法

SQLFluffには「lint」と「fix」という2つの主要な機能があります。

Lint

lintは、SQLクエリを読み込み、見つかった問題を表示します。

次のSQLクエリを考えてみます。

example.sql
       SELECT
  ABC, XYZ
  froM
TMP

lintを使用するには、次のようにSQLクエリを入力します。

bash
$ sqlfluff lint example.sql --dialect=bigquery

== [example.sql] FAIL
L:   1 | P:   1 | LT01 | Expected only single space before 'SELECT' keyword.
                       | Found '       '. [layout.spacing]
L:   1 | P:   1 | LT02 | First line should not be indented.
                       | [layout.indent]
L:   1 | P:   1 | LT13 | Files must not begin with newlines or whitespace.
                       | [layout.start_of_file]
L:   1 | P:   8 | LT09 | Select targets should be on a new line unless there is
                       | only one select target.
                       | [layout.select_targets]
L:   2 | P:   1 | LT02 | Expected indent of 4 spaces.
                       | [layout.indent]
L:   3 | P:   3 | CP01 | Keywords must be consistently upper case.
                       | [capitalisation.keywords]
L:   4 | P:   1 | LT02 | Expected indent of 4 spaces.
                       | [layout.indent]
All Finished 📜 🎉!

lintは、複数行のテキストを出力し、各行がSQLクエリの特定の問題を示しています。

この出力では、Lは行番号を示し、Pはその行内の問題の位置を示します。その後にLT01LT02などのエラーコードがあり、その後に特定の問題を説明するメッセージが表示されます。

SQLFluffが返すエラーコードの詳細な理解については、公式ドキュメントを参照してください。

https://docs.sqlfluff.com/en/stable/rules.html

方言(dialect)

SQLFluffを使用する際には、さまざまな方言を選択できます。利用可能な方言をリストするには、次のコマンドを使用します。

bash
$ sqlfluff dialects

==== sqlfluff - dialects ====
ansi:                 ansi dialect [inherits from 'nothing']
athena:                athena dialect [inherits from 'ansi']
bigquery:            bigquery dialect [inherits from 'ansi']
clickhouse:        clickhouse dialect [inherits from 'ansi']
databricks:    databricks dialect [inherits from 'sparksql']
db2:                      db2 dialect [inherits from 'ansi']
duckdb:            duckdb dialect [inherits from 'postgres']
exasol:                exasol dialect [inherits from 'ansi']
greenplum:      greenplum dialect [inherits from 'postgres']
hive:                    hive dialect [inherits from 'ansi']
materialize:   materialize dialect [inherits from 'postgres']
mysql:                  mysql dialect [inherits from 'ansi']
oracle:                oracle dialect [inherits from 'ansi']
postgres:            postgres dialect [inherits from 'ansi']
redshift:        redshift dialect [inherits from 'postgres']
snowflake:          snowflake dialect [inherits from 'ansi']
soql:                    soql dialect [inherits from 'ansi']
sparksql:            sparksql dialect [inherits from 'ansi']
sqlite:                sqlite dialect [inherits from 'ansi']
teradata:            teradata dialect [inherits from 'ansi']
tsql:                    tsql dialect [inherits from 'ansi']

SQLFluffのルールのカスタマイズ

SQLFluffでは、ルールの詳細なカスタマイズが可能です。全てのルールを構成することもでき、個々のルールやルールの適用範囲もカスタマイズできます。

ルールの設定は、次のファイルのいずれかにカスタム設定を記述することで変更できます。

  • setup.cfg
  • tox.ini
  • pep8.ini
  • .sqlfluff
  • pyproject.toml

例えば、.sqlfluffファイルを次のように設定します。

.sqlfluff
[sqlfluff]
dialect = bigquery
exclude_rules = L036

この場合、ルールL036以外の全てのルールが適用されます。

fix

lintは、設定されたルールに基づいてSQLクエリの問題を指摘するだけですが、fixはさらに一歩進みます。問題を特定するだけでなく、自動的に修正を試みます。

fixを使用するには、次のコマンドを使用します。

bash
$ sqlfluff fix example1.sql --dialect=bigquery

==== finding fixable violations ====
== [example.sql] FAIL
L:   1 | P:   1 | LT01 | Expected only single space before 'SELECT' keyword.
                       | Found '       '. [layout.spacing]
L:   1 | P:   1 | LT02 | First line should not be indented.
                       | [layout.indent]
L:   1 | P:   8 | LT09 | Select targets should be on a new line unless there is
                       | only one select target.
                       | [layout.select_targets]
L:   2 | P:   1 | LT02 | Expected indent of 4 spaces.
                       | [layout.indent]
L:   3 | P:   3 | CP01 | Keywords must be consistently upper case.
                       | [capitalisation.keywords]
L:   4 | P:   1 | LT02 | Expected indent of 4 spaces.
                       | [layout.indent]
==== fixing violations ====
6 fixable linting violations found

Are you sure you wish to attempt to fix these? [Y/n]

コマンドを実行すると、SQLFluffはまずルールの違反を見つけます。違反が見つかると、修正を試みる前に確認を求められます。修正を行う場合は、Yと回答して進めます。

Attempting fixes...
Persisting Changes...
== [example.sql] FIXED
Done. Please check your files to confirm.
All Finished 📜 🎉!

修正を確認した後、SQLFluffは自動的に必要な変更をSQLクエリに適用します。

example.sql
SELECT
    ABC,
    XYZ
FROM
    TMP

lintと同様に、fixも必要に応じてルールをカスタマイズすることができます。

参考

https://github.com/sqlfluff/sqlfluff
https://docs.sqlfluff.com/en/stable/rules.html

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!