SQLFluffでSQLをリントするための設定ファイルをつくる

プログラミング

はじめに

SQLFluffとはSQLのリント(Lint)ツールです。

SQLFluff
📜 The SQL Linter for humans

SQLFluffのインストール方法は公式のGetting Startedページに記載されています。

SQLFluffでは、設定ファイル .sqlfluff を作成することで、独自のルールでSQLをリントすることができます。

ここで設定できるルールの詳細は公式ドキュメントに記載されています。

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

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 を使うことでクエリのフォーマットを統一できます。

タイトルとURLをコピーしました