📌

sqlfluff に render が実装されたので、templating されている sql ファイルの取り回しが便利に

2022/11/21に公開

Summary

  • sqlfluff の最新版(1.4.2)で、 sqlfluff render が実装された。
  • Airflow などで使われている、jinja template の sql ファイルに、sqlfluff からパラメータを渡して、render できるようになったので、local での取り回しなどが便利になった。
  • この記事では、ユースケースをちょっとだけ紹介する。

Install

$ python3 -m venv .venv
$ .venv/bin/pip install sqlfluff
$ .venv/bin/sqlfluff --version
sqlfluff, version 1.4.2

Sample Project

以下のようなプロジェクトを想定する。

$ tree -a -L 2
.
├── .sqlfluff
├── .venv
│   ├── bin
│   ├── include
│   ├── lib
│   └── pyvenv.cfg
├── sql
│   └── sample.sql
└── sqlfluff_libs
    └── params.py

.sqlfluff

[sqlfluff]
ignore_templated_areas = True
dialect = bigquery

[sqlfluff:templater:jinja:context]

[sqlfluff:templater:jinja]
library_path = sqlfluff_libs

sample.sql

select
  *
from
  `foo-project.{{ params.dataset }}.{{ params.table }}`
;

sqlfluff_libs/params.py

import os

dataset = os.getenv("DATASET", "foobar_dataset")
table = os.getenv("TABLE", "foobar_table")

Example

その1. そのまま render してみる

$ .venv/bin/sqlfluff render sql/sample.sql
select
  *
from
  `foo-project.foobar_dataset.foobar_table`
;

params.datasetparams.table が 置換されていることがわかる。

その2. 環境変数で渡して render してみる

$ DATASET=foobar2_dataset TABLE=foobar2_table .venv/bin/sqlfluff render sql/sample.sql
select
  *
from
  `foo-project.foobar2_dataset.foobar2_table`
;

os.getenv() が反映されているのがわかる。

べんりー

余談

おかげで以下のように、bq コマンドに sql をそのまま渡せるようになりました。うれしー

$ sqlfluff render /path/to/foobar.sql | bq query 

Discussion