はじめに
SQLFluffとはSQLのリント(Lint)ツールです。
SQLFluffのインストール方法は公式のGetting Startedページに記載されています。
SQLFluffでは、設定ファイル .sqlfluff
を作成することで、独自のルールでSQLをリントすることができます。
ここで設定できるルールの詳細は公式ドキュメントに記載されています。
SQLFluffの設定ファイル
以下は著者が使用している設定ファイルです。設定しているルールの詳細は記事の最後に記載しておきます。
# Ref: https://docs.sqlfluff.com/en/stable/rules.html
[sqlfluff]
rules = all
dialect = bigquery
templater = jinja
sql_file_exts = .sql,.sql.j2,.dml,.ddl
max_line_length = 100
exclude_rules = AL07, ST06, ST05
[sqlfluff:indentation]
indented_joins = True
indented_using_on = True
tab_space_size = 2
indent_unit = space
[sqlfluff:rules]
allow_scalar = True
single_table_references = consistent
[sqlfluff:layout:type:comma]
line_position = trailing
[sqlfluff:rules:capitalisation.keywords]
capitalisation_policy = upper
[sqlfluff:rules:aliasing.table]
# Aliasing preference for tables
aliasing = explicit
[sqlfluff:rules:aliasing.column]
# Aliasing preference for columns
aliasing = explicit
[sqlfluff:rules:capitalisation.identifiers]
# Unquoted identifiers
extended_capitalisation_policy = lower
[sqlfluff:rules:ambiguous.column_references]
# GROUP BY/ORDER BY column references
group_by_and_order_by_style = explicit
[sqlfluff:rules:layout.long_lines]
# Should lines that contain only whitespace and comments be ignored when linting line lengths?
ignore_comment_lines = True
SQLFluff でリント、フォーマッティング
設定ファイル .sqlfluff
を配置したディレクトリで、下記のコマンドを実行することで独自のルールでリントが可能です。
$ sqlfluff lint {sqlファイルのパス}
また、下記のコマンドでSQLのフォーマッティングも可能です。
$ sqlfluff fix {sqlファイルのパス}
設定ルールの詳細
sqlfluff:indentation
SQL のインデントに関するルールです。
[sqlfluff:indentation]
indented_joins = True
indented_using_on = True
tab_space_size = 2
indent_unit = space
Anti-pattern
インデントがバラバラ
SELECT ••→a, •••••b FROM foo
Best practice
インデントはスペース2つ単位である
SELECT ••a, ••b FROM foo
sqlfluff:rules
SQL の基本的なルールです。
[sqlfluff:rules]
allow_scalar = True
single_table_references = consistent
- allow_scalar = True
計算式カラムにエイリアスを強制します。
Anti-pattern
計算式カラムにエイリアスがない
SELECT sum(a), sum(b) FROM foo
Best practice
計算式カラムにはエイリアスをつける
SELECT sum(a) AS a_sum, sum(b) AS b_sum FROM foo
- single_table_references = consistent
修飾子に一貫性を強制します。
Anti-pattern
修飾子 あり/なし がバラバラ
SELECT a, foo.b FROM foo
Best practice
修飾子 あり/なし を統一する
SELECT a, b FROM foo -- Also good SELECT foo.a, foo.b FROM foo
sqlfluff:layout:type:comma
カラムを区切る カンマ に関するルールです。
[sqlfluff:layout:type:comma]
line_position = trailing
Anti-pattern
カンマ の位置がバラバラ
SELECT a , b, c FROM foo
Best practice
カンマ はカラムの後ろにつける
SELECT a, b, c FROM foo
sqlfluff:rules:capitalisation.keywords
SQL 予約語の大文字・小文字に関するルールです。
[sqlfluff:rules:capitalisation.keywords]
capitalisation_policy = upper
Anti-pattern
SQL 予約語の 大文字/小文字 がバラバラ
select a FROM foo
Best practice
SQL 予約語は 大文字 にする
SELECT a FROM foo
sqlfluff:rules:aliasing.table
テーブル名のエイリアスに関するルールです。
[sqlfluff:rules:aliasing.table]
aliasing = explicit
Anti-pattern
テーブル名のエイリアスで AS
がない
SELECT voo.a FROM foo voo
Best practice
テーブル名のエイリアスは AS
をつける
SELECT voo.a FROM foo AS voo
sqlfluff:rules:aliasing.column
カラム名のエイリアスに関するルールです。
[sqlfluff:rules:aliasing.column]
aliasing = explicit
Anti-pattern
カラム名のエイリアスで AS
がない
SELECT a alias_col FROM foo
Best practice
カラム名のエイリアスは AS
をつける
SELECT a AS alias_col FROM foo
sqlfluff:rules:capitalisation.identifiers
SQL 非予約語 (テーブル名やカラム名など) に関するルールです。
[sqlfluff:rules:capitalisation.identifiers]
extended_capitalisation_policy = lower
Anti-pattern
カラム名の 大文字/小文字 がバラバラ
SELECT a, B FROM foo
Best practice
カラム名は 小文字 にする
SELECT a, b FROM foo
sqlfluff:rules:ambiguous.column_references
GROUP BY/ORDER BY
に指定するカラムに関するルールです。
[sqlfluff:rules:ambiguous.column_references]
group_by_and_order_by_style = explicit
Anti-pattern
GROUP BY
に指定するカラムが カラム名/数値 でバラバラ
SELECT foo, bar, sum(baz) AS sum_value FROM fake_table GROUP BY foo, 2;
Best practice
GROUP BY
に指定するカラムは カラム名 とする
SELECT foo, bar, sum(baz) AS sum_value FROM fake_table GROUP BY foo, bar;
まとめ
- SQLFluff を使うことでクエリのフォーマットを統一できます。