← コースに戻る
未ログインのため、この講座の進捗は記録されません。ログインすると記録が残るようになります。
Jinjaとマクロ
dbtのモデルは素のSQLだけでなく、Jinjaというテンプレート言語を組み合わせて書くことができる。Jinjaには3種類の記法(delimiter)がある。
| 記法 | 種類 | 役割 |
|---|---|---|
{{ ... }} | 式 | 値を出力する(変数の参照やref()・マクロの呼び出しなど) |
{% ... %} | 文 | ifやforなどの制御構文。それ自体は値を出力しない |
{# ... #} | コメント | コンパイル後のSQLには出力されない |
Jinjaを使うと、forループで同じパターンのSQLを繰り返し生成したり、環境によって挙動を変えたりできる。
さらに、繰り返し使うSQLの断片はマクロ(macro)として関数のように定義できる。
-- macros/cents_to_dollars.sql
{% macro cents_to_dollars(column_name) %}
({{ column_name }} / 100)::numeric(16, 2)
{% endmacro %}
-- models/stg_payments.sql
select
id as payment_id,
{{ cents_to_dollars('amount') }} as amount_usd
from raw.payments
マクロを使うことで、同じ変換ロジックを複数のモデルで重複して書かずに済み、修正が必要になったときも1箇所を直すだけで済む。