Loading
BLOG 開発者ブログ

2024年12月3日

SQL Fluff カスタムルールの覚書(導入編)

こんにちは。クラウドソリューショングループのkaneko.kです。
バッチ処理で実行するSQLファイルをVSCode上で静的解析をし、チームで同じコーディング規約を遵守させるためにFishtown Analytics社のSQL Fluffの導入をしてみました。
ところがどうにも痒いところに手が届かない事象が出てきてしまったため、今回は「カスタムルール」の導入にまつわる覚書を共有します。
元々Python用のSQL Linterという事もあり、VSCode上でLintさせるための手順があまり広がっていないようなので、同様に導入検討されている方の一助になれば幸いです。

0. 対象者

本記事では既にVSCodeにSQL Fluffの導入が完了しており、カスタムルールを追加したいという方に向けた記事です。
SQL Fluffの初期導入や基礎的な設定項目については他の方にお任せすることとします。
また、バージョンについては下記を利用していますので、最新の書き方について公式を確認するようお願いします。
Python:3.13.0
SQL Fluff:3.2.5
VSCode:1.95.3

1. ディレクトリ構成

今回は以下のようなディレクトリ構成で説明をしていきます。
この辺りは割と自由の効くところですので、ご自身のプロジェクトに合わせて設計してみてください
Project
┠ linter
┃      ┠ build            # 自動生成
┃      ┠ rules
┃      ┃     ┠ _pycache_ # 自動生成
┃      ┃     ┠ _init_.py
┃      ┃     ┠ Lxxx_custom.py
┃      ┃     ┠ plugin_default_config.cfg
┃      ┃     ┗ rules.py
┃      ┠ rules.egg-info   # 自動生成
┃      ┗ setup.py
┠ .sqlfluff

2. setup.pyの作成

下記のようなファイルを作成し、この後作成するrules.pyのエントリーポイントを指定する
from setuptools import setup, find_packages


setup(
    name="rules",
    version="0.1.0",
    packages=find_packages(),
    entry_points={
        'sqlfluff': [
            'rules = rules.rules',  # エントリーポイント
        ]
    }
)

3. rules.pyの作成

利用するカスタムルールの読み出しを行うPythonファイルを作成する
※ 今回はカスタムルール クラス名をRule_Custom_L900としてます
from sqlfluff.core.plugin import hookimpl
from sqlfluff.core.rules import BaseRule
from typing import List import os.path
from sqlfluff.core.config import load_config_file


@hookimpl
def get_rules() -> List[BaseRule]:
    """Get plugin rules."""
    from .L900_custom import Rule_Custom_L900
    return [Rule_Custom_L900]




@hookimpl
def load_default_config() -> dict:
    """Loads the default configuration for the plugin."""
    return load_config_file(
        file_dir=os.path.dirname(__file__),
        file_name="plugin_default_config.cfg",
    )

4. plugin_default_config.cfgファイルの作成

カスタムルール特有のコンフィグを設定する場合にこちらに記述していきます
(L900を有効にしているときはLxxxを無効にする等)
今回はいったん空ファイルでも大丈夫です
なお、設定フォーマット自体は.sqlfluffと同様になります

5. カスタムルールクラスの作成

実際に実行されるカスタムルールを作成します
from sqlfluff.core.rules.base import BaseRule, LintResult, RuleContext
from sqlfluff.core.parser import RawSegment
from sqlfluff.core.rules.crawlers import RootOnlyCrawler


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


    # Rule configuration
    groups = ["all"]
    rule_code = "L900"
    crawl_behaviour = RootOnlyCrawler() # クロールの振る舞い設定(後述)


    def _eval(self, context: RuleContext) -> LintResult:
      if <何かしら条件式>:
        return LintResult(
           anchor=<問題の位置を示すセグメント:optional>,
           fixes=<この問題を修正するためのLintFix配列:optional>,
           memory=<>
           description=<本結果として特定された問題の説明文:optional>)
      return None

6. .sqlfluffファイルの作成

設定ファイルに作成したカスタムルールを追加します
[sqlfluff]
dialect = mysql   #必須なので、対象の言語に合わせて変更してください


[rules]
#カスタムルールの追加設定(複数ある場合はカンマ区切りで追加できます)
rules = L900
rule_allowlist = L900

7. ビルドコマンドの実行

以下のコマンドを作成したsetup.pyのあるディレクトリ上で実行するとビルドされて適応できます
$  pip install -e .
Successfully installed rules-x.x.xと表示されれば成功です

8. 次回

今回触れられなかったカスタムルールの「crawl_behaviour」や「groups」について簡単な解説をしつつ、
チートシートを用意して開発の補助になる記事を書いていきますので、お楽しみに。

 

kaneko.kのブログ