SQLFluffとは
SQLFluffは、SQLのフォーマットの問題を自動的に特定し修正するオープンソースソフトウェア(OSS)です。さまざまなSQL方言(文法)をサポートしており、多様なSQL環境で効果的かつ柔軟なツールとなっています。
公式のGitHubリポジトリからSQLFluffと最新のアップデートにアクセスできます。
他の言語とは異なり、SQLには特定のライティングのガイドラインがあまりありません。しかし、セールス担当やマーケティング担当などのIT以外のプロフェッショナルがデータ分析のためにSQLを書く傾向が急速に増加しています。データ分析のためにSQLを使用する人々がますます増えるにつれて、生成されるSQLクエリのスタイルは大きく異なるものになります。SQLクエリの書き方を半ば強制的に統一するためにSQLFluffを使用することは、標準を維持しデータ分析の効率を向上させるための良い試みとされます。
インストール
SQLFluffをインストールするには、システムにPython3がインストールされている必要があります。
Pythonのパッケージマネージャであるpipを使用してSQLFluffをインストールします。次のコマンドを入力します。
$ pip3 install sqlfluff
SQLFluffの使用方法
SQLFluffには「lint」と「fix」という2つの主要な機能があります。
Lint
lintは、SQLクエリを読み込み、見つかった問題を表示します。
次のSQLクエリを考えてみます。
SELECT
ABC, XYZ
froM
TMP
lintを使用するには、次のようにSQLクエリを入力します。
$ 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
はその行内の問題の位置を示します。その後にLT01
、LT02
などのエラーコードがあり、その後に特定の問題を説明するメッセージが表示されます。
SQLFluffが返すエラーコードの詳細な理解については、公式ドキュメントを参照してください。
方言(dialect)
SQLFluffを使用する際には、さまざまな方言を選択できます。利用可能な方言をリストするには、次のコマンドを使用します。
$ 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]
dialect = bigquery
exclude_rules = L036
この場合、ルールL036
以外の全てのルールが適用されます。
fix
lintは、設定されたルールに基づいてSQLクエリの問題を指摘するだけですが、fixはさらに一歩進みます。問題を特定するだけでなく、自動的に修正を試みます。
fixを使用するには、次のコマンドを使用します。
$ 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クエリに適用します。
SELECT
ABC,
XYZ
FROM
TMP
lintと同様に、fixも必要に応じてルールをカスタマイズすることができます。
参考