使用するLinter
SQLFluffとは
- SQLの方言 (*1)に柔軟に対応したSQLリンター
- ELTアプリケーションを意識して設計され、Jinjaテンプレートやdbtテンプレートにも対応
- ほとんどのLintエラーを自動修正できる
*1. サポートされるSQL方言:
ANSI SQL / Athena / BigQuery / ClickHouse / Databricks / Db2 / Exasol / Hive / MySQL / Oracle / PostgreSQL / Redshift / Snowflake / SOQL / SparkSQL / SQLite / Teradata / Transact-SQL
Dockerで動かす
$ docker pull sqlfluff/sqlfluff:<version_tag>
$ docker run -it --rm -v $PWD:/sql sqlfluff/sqlfluff:<version_tag> lint <args>
例:
$ docker pull sqlfluff/sqlfluff:0.9.4
$ docker run -it --rm -v $PWD:/sql sqlfluff/sqlfluff:0.9.4 lint sample_sql --dialect bigquery
c.f. https://hub.docker.com/r/sqlfluff/sqlfluff
CIで動かす(Github Actions)
- Pull Request(以降PR)をトリガーにGitHub ActionsでLinter動かす
- 以下内容で
.github/workflows/lint_sql.yml
を作成しGitHubリポジトリに配置する
name: Lint SQL
on: [pull_request]
jobs:
lint-sql:
runs-on: ubuntu-latest
steps:
- uses: "actions/checkout@v2"
- uses: "actions/setup-python@v2"
with:
python-version: "3.8"
- name: Install SQLFluff
run: "pip install sqlfluff==0.9.4"
- name: Lint sql
run: "sqlfluff lint sample_sql --dialect bigquery"
c.f. https://github.com/sqlfluff/sqlfluff-github-actions/tree/main/menu_of_workflows/sunrise_movement
上記は、PRをトリガーにsample_sqlディレクトリ配下の*.sqlファイルをBigQuery構文でLintチェックする
実際に動かしてみると以下のようになる。
上記PR:https://github.com/luckyriverr/sqlfluff_ci/pull/3
ルール
- 一覧
- 特定の行だけルール無視したい場合、
-- noqa: <rule>
を記述する
SELECT DATETIME('2021-09-01 12:34:56') AS timestamp, 500 AS amount -- noqa: L036, L029
UNION ALL
SELECT DATETIME('2021-09-02 01:12:23') AS timestamp, 150 AS amount -- noqa: L036, L029
c.f. https://docs.sqlfluff.com/en/stable/rules.html#inline-ignoring-errors
- 特定のルール定義を変更もできる
- その場合、sqlfluffコマンド実行する直下ディレクトリに
.sqlfluff
ファイルを格納する(以下サンプル)
[sqlfluff:rules]
tab_space_size = 2
[sqlfluff:rules:L016]
ignore_comment_lines = True
indent_unit = space
max_line_length = 120
c.f. https://docs.sqlfluff.com/en/stable/configuration.html#configuration
デモコード
GitHub: https://github.com/luckyriverr/sqlfluff_ci
以下ですぐに動かせます。
$ git clone git@github.com:luckyriverr/sqlfluff_ci.git
$ cd sqlfluff_ci
$ docker pull sqlfluff/sqlfluff:0.9.4
$ docker run -it --rm -v $PWD:/sql sqlfluff/sqlfluff:0.9.4 lint sample_sql --dialect bigquery
最後に
デモコードも含め、ご自由にご利用ください。
参考
公式ドキュメントはこちら
以下の書籍も参考になります。