Loading
BLOG 開発者ブログ

2025年6月2日

SQLFluff カスタムルールの覚書(groups編)

こんにちは。クラウドソリューショングループのkaneko.kです。
本記事ではこちらの記事「SQLFluff カスタムルールの覚書(導入編)」及び「同(crawl_behaviour編)」の続きになります。
実際に導入してみたカスタムルールの細かいところを解説しつつ、チートシートを参考にあなたの開発に役立てればと思います。

0. 対象者

本記事では、既にVSCodeにSQLFluffの導入が完了しており、カスタムルールを追加したいという方を対象としています。
SQLFluffの初期導入や基本的な設定項目については他の方にお任せすることとします。

また、以下のバージョンを使用していますので、最新の書き方については公式ドキュメントをご確認ください。

  • Python:3.13.0

  • SQLFluff:3.2.5

  • VSCode:1.96.4

1.チートシート

項番 Group名 用途 代表的なルール例
2.1. all すべてのルールが属するグループ  –
2.2. core デフォルトで有効になっているルール  列の暗黙的/明示的なエイリアス化(AL02)等
2.3. ambiguous 曖昧な書き方を明示的行うよう注意するようなルール GROUP BYのあるSELECT句での曖昧なDISTINCT(AM01)等
2.4. aliasing エイリアス名に関するルール テーブルの暗黙的/明示的なエイリアス(AL01)等
2.5. capitalisation 大文字かどうかに関するルール キーワードの大文字/小文字の使い方が一貫しているか(CP01)等
2.6. convention 慣例的なルールに関するルール  不等演算子が!=か<>で一貫しているか(CV01)等
2.7. jinja PythonのテンプレートエンジンであるJinjaに関するルール Jinja タグに両側に 1 つの空白があるか(JJ01)のみ
2.8. layout 空白有無やインデント等のレイアウトに関するルール  不適切な空白文字(LT01)等
2.9. references 参照先に関するルール  From句に存在しないオブジェクトが参照先に設定されている(RF01)等
2.10. structure SQL文構造に関するルール case when 文では else null を指定しない(ST01)等
2.11. tsql Microsoft社製のSQL拡張言語であるT-SQL(Transact-SQL)に関するルール T-SQL のユーザー定義ストアド プロシージャでは、SP_ プレフィックスを使用しない(TQ01)のみ

2. groupsについて

.sqlfluffファイルでルールの有効/無効を設定する際、ルールコード(AL01など)を指定するだけでなく、グループ単位で制御することも可能です。

たとえば、以下のように設定すると:

[sqlfluff]
exclude_rules =AL01, layout
この場合、AL01(テーブルの暗黙的/明示的なエイリアスに関するルール)と、layoutグループに属するすべてのルールが無効化されます。
以降の章ではデフォルトで用意されているグループと最後に独自のグループについて紹介します。
※ 各ルールに対してはこちらの公式ドキュメントに纏まっていますので、ルールの詳細については公式をご参照ください。

2.1. all

すべてのルールが属しているグループです。
 “all” を指定して制御するケースは少ないかもしれませんが、カスタムルールを作成した場合もこのグループに属させておくことで、グループの属性として正しく制御されるため、忘れずに指定しておきましょう。

2.2. core

デフォルトで有効になっているルールが属しているグループです。
執筆時点での設定では下記が該当します。
※ 詳細は公式サイト(https://docs.sqlfluff.com/en/stable/reference/rules.html#rule-index)の「Groups」に「core」が割り当てられているルールを参照ください
ルール名 エイリアス名
aliasing.column AL02
aliasing.expression AL03
aliasing.unique.table AL04
aliasing.unused AL05
aliasing.length AL06
aliasing.unique.column AL08
aliasing.self_alias.column AL09
ambiguous.distinct AM01
ambiguous.union AM02
ambiguous.column_references AM06
capitalisation.keywords CP01
capitalisation.types CP05
convention.select_trailing_comma CV03
convention.count_rows CV04
convention.is_null CV05
jinja.padding JJ01
layout.spacing LT01
layout.indent LT02
layout.long_lines LT05
layout.functions LT06
layout.cte_bracket LT07
layout.cte_newline LT08
layout.select_modifiers LT10
layout.set_operators LT11
layout.end_of_file LT12
references.from RF01
structure.unused_cte ST03
structure.distinct ST08

2.3. ambiguous

SQLの構文で曖昧な書き方を明示的に避けるよう促すルールが属するグループです。
ルールコードが「AM」から始まるルールが対象となります。
執筆時点での設定では下記が該当します。
ルール名 エイリアス名
ambiguous.distinct AM01
ambiguous.union AM02
ambiguous.order_by AM03
ambiguous.column_count AM04
ambiguous.join AM05
ambiguous.column_references AM06
ambiguous.set_columns AM07
ambiguous.join_condition AM08

2.4. aliasing

エイリアス名に関するルールが属するグループです。
ルールコードが「AL」から始まるルールが対象となります。
執筆時点での設定では下記が該当します。
ルール名 エイリアス名
aliasing.table AL01
aliasing.column AL02
aliasing.expression AL03
aliasing.unique.table AL04
aliasing.unused AL05
aliasing.length AL06
aliasing.forbid AL07
aliasing.unique.column AL08
aliasing.self_alias.column AL09

2.5. capitalisation

capitalisation(大文字・小文字の使用)に関するルールが属するグループです。
ルールコードが「CP」から始まるルールが対象となります。
執筆時点での設定では下記が該当します。
ルール名 エイリアス名
capitalisation.keywords CP01
capitalisation.identifiers CP02
capitalisation.functions CP03
capitalisation.literals CP04
capitalisation.types CP05

2.6. convention

convention(慣例的なルール)に関するルールが属しているグループです。
ルールコードが「CV」から始まるルールが対象になります。
執筆時点での設定では下記が該当します。
ルール名 エイリアス名
convention.not_equal CV01
convention.coalesce CV02
convention.select_trailing_comma CV03
convention.count_rows CV04
convention.is_null CV05
convention.terminator CV06
convention.statement_brackets CV07
convention.left_join CV08
convention.blocked_words CV09
convention.quoted_literals CV10
convention.casting_style CV11
convention.join_condition CV12

2.7. jinja

PythonのテンプレートエンジンであるJinjaに関するルールが属しているグループです。
ルールコードが「JJ」から始まるルールが対象になります。
執筆時点での設定では下記が該当します。
ルール名 エイリアス名
jinja.padding JJ01

2.8. layout

空白有無やインデント等のレイアウトに関するルールが属しているグループです。
ルールコードが「LT」から始まるルールが対象になります。
執筆時点での設定では下記が該当します。
ルール名 エイリアス名
layout.spacing LT01
layout.indent LT02
layout.operators LT03
layout.commas LT04
layout.long_lines LT05
layout.functions LT06
layout.cte_bracket LT07
layout.cte_newline LT08
layout.select_targets LT09
layout.select_modifiers LT10
layout.set_operators LT11
layout.end_of_file LT12
layout.start_of_file LT13
layout.keyword_newline LT14

2.9. references

参照先に関するルールが属しているグループです。
ルールコードが「RF」から始まるルールが対象になります。
執筆時点での設定では下記が該当します。
ルール名 エイリアス名
references.from RF01
references.qualification RF02
references.consistent RF03
references.keywords RF04
references.special_chars RF05
references.quoting RF06

2.10. structure

SQLに不要な句がある等のSQL文構造に関するルールが属しているグループです。
ルールコードが「ST」から始まるルールが対象になります。
執筆時点での設定では下記が該当します。
ルール名 エイリアス名
structure.else_null ST01
structure.simple_case ST02
structure.unused_cte ST03
structure.nested_case ST04
structure.subquery ST05
structure.column_order ST06
structure.using ST07
structure.distinct ST08
structure.join_condition_order ST09
structure.constant_expression ST10
structure.unused_join ST11

2.11. tsql

Microsoft社製のSQL拡張言語であるT-SQL(Transact-SQL)に関するルールが属しているグループです。
ルールコードが「TQ」から始まるルールが対象になります。
執筆時点での設定では下記が該当します。
ルール名 エイリアス名
tsql.sp_prefix TQ01

 

2.12. カスタムグループ

自作ルールには、独自のグループを付与できます。
辞書ファイルなどで一元管理されているわけではないため、Rule_Custom_XXXX クラスの groups 変数に、開発チーム内で決定した文字列を設定してください。

✅ おすすめの運用

すべてのカスタムルールに共通で「custom」グループを割り当てておき、「all」と共に指定してON/OFFを一括制御できるようにすると便利です。
既存グループに属させても構いませんが、通常、カスタムルールは独自で制御することが多いため、分けて管理する方が明瞭です。

from sqlfluff.core.rules.base import BaseRule, LintResult, RuleContext
from sqlfluff.core.rules.crawlers import SegmentSeekerCrawler


class Rule_Custom_XXXX(BaseRule):
    """ ルールの概要:... """


    # Rule configuration
    groups = ["all", "custom"]
    rule_code = "XXXX"
    crawl_behaviour = SegmentSeekerCrawler({"xxxx"})


    def _eval(self, context: RuleContext) -> LintResult:
""" SQLのLint処理 """

3. まとめ

3回にわたってSQLFluffにおけるカスタムルールの導入方法をご紹介しました。
公式ドキュメントを紐解きながら、カスタムルールを作成するまでに必要な知識や手順を解説しましたが、少しでもあなたの開発の助けになれば幸いです。
本当に大変なのは、この先の「どのようなSQLのLint処理を実装するか」という部分かと思います。
ここは目的やプロジェクトに応じた工夫が求められる領域ですので、試行錯誤を楽しみながら、自分に合ったLint開発を進めていただければと思います。
kaneko.kのブログ