ETLのTransformツール dbtにおけるJinjaとマクロの基礎

dbt

 データエンジニアリングにおけるETL処理において、DWに存在するデータに対してT(Transform)の処理を実施するツールとしてdbt(data build tool)が有名です。

 dbtにおいて、整形するSQL文を柔軟に記述できる方法としてJinjaというものがあります。Jinjaについて概要を見ていきます。

1. Jinjaとは?

Jinja は、Pythonで動作するテンプレートエンジンの一つです。


HTMLやSQLなどのテキストを動的に生成するために使われ、
{{ ... }}{% ... %} という独自の構文で変数展開や制御構造を書けます。

dbt(Data Build Tool)では、このJinjaをSQL内に組み込み、
動的にSQLを生成する 仕組みとして活用しています。

例:

select *
from {{ ref('my_table') }}
where date >= '{{ var("start_date") }}'

ここで {{ ... }} の部分がJinja構文で、変数や関数の結果をSQLに埋め込みます。


2. dbtとJinjaの関係

dbtでは、SQLモデルファイル(.sql)の中でそのままJinja構文が使えるようになっています。
これにより、次のようなことが可能です。

  • テーブル名・カラム名の動的切り替え{{ ref("...") }}{{ var("...") }}
  • 条件式の制御{% if ... %}{% for ... %}
  • 繰り返し処理や条件分岐によるSQL生成

つまり、Jinjaはdbtモデルの「動的化エンジン」の役割を担っています。


3. マクロ(Macros)とは?

マクロ は、Jinja構文で作る「再利用可能な関数」のようなものです。
共通処理や複雑なロジックを一箇所にまとめ、複数のモデルやスクリプトから呼び出せます。

マクロの定義

マクロは macros/ ディレクトリ内に .sql ファイルとして保存します。

-- macros/hello_world.sql
{% macro hello_world(name) %}
    select 'Hello, {{ name }}!' as greeting
{% endmacro %}

マクロの呼び出し

モデルファイルからは、{{ macro_name(arg1, arg2, ...) }} の形式で呼び出します。

{{ hello_world('dbt user') }}
select 'Hello, dbt user!' as greeting
用途適した機能
簡単な変数展開・条件分岐Jinja構文
複数モデルで共通利用する処理マクロ
SQL構造自体を動的に生成マクロ+Jinja組み合わせ

5. よく使われる組み込みマクロ例

  • ref(): 他のモデルやseedを依存関係付きで参照
  • source(): 生データ(ソーステーブル)を参照
  • var(): dbt_project.yml やコマンドラインから渡す変数を取得
  • config(): モデル単位の設定(マテリアライズ方法など)

6. まとめ

dbtの中で使用されるJinjaですが、まとめると下記のようになります。

  • Jinja は dbt SQL内で変数展開・条件分岐・繰り返し処理を可能にするテンプレートエンジン
  • マクロ はJinjaを使って書く「再利用可能な関数」
  • Jinjaは単発の動的処理に、マクロは共通化・複雑処理に向いている
  • dbtの組み込みマクロ(ref()source()など)を使うことで、依存関係管理や変数化が容易になる

最新情報をチェックしよう!