データエンジニアリングにおける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()など)を使うことで、依存関係管理や変数化が容易になる