データエンジニアリングにおけるETL処理において、DWに存在するデータに対してT(Transform)の処理を実施するツールとしてdbt(data build tool)が有名です。
dbtにおいて、整形するSQL文を柔軟に記述できる方法としてJinjaというものがあります。Jinjaについて概要を見ていきます。
Table of Contents
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()
など)を使うことで、依存関係管理や変数化が容易になる