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

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
2.1. all
2.2. 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
ルールコードが「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
ルールコードが「CP」から始まるルールが対象となります。
| ルール名 | エイリアス名 |
| capitalisation.keywords | CP01 |
| capitalisation.identifiers | CP02 |
| capitalisation.functions | CP03 |
| capitalisation.literals | CP04 |
| capitalisation.types | CP05 |
2.6. convention
| ルール名 | エイリアス名 |
| 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
| ルール名 | エイリアス名 |
| jinja.padding | JJ01 |
2.8. layout
| ルール名 | エイリアス名 |
| 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
| ルール名 | エイリアス名 |
| references.from | RF01 |
| references.qualification | RF02 |
| references.consistent | RF03 |
| references.keywords | RF04 |
| references.special_chars | RF05 |
| references.quoting | RF06 |
2.10. structure
| ルール名 | エイリアス名 |
| 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
| ルール名 | エイリアス名 |
| 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. まとめ
ここは目的やプロジェクトに応じた工夫が求められる領域ですので、試行錯誤を楽しみながら、自分に合ったLint開発を進めていただければと思います。









