データマネジメントの学校
← コースに戻る

未ログインのため、この講座の進捗は記録されません。ログインすると記録が残るようになります。

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箇所を直すだけで済む。