■ はじめに
dbt で macro を修正する必要があり、 jinja2の基本的な文法事項が分かっていなかったので まとめておく。
目次
【1】基本 【2】コメント文 1)使用上の注意 【3】変数 1)変数定義 2)変数参照 【4】if文 1)論理演算子 【5】for文 1)break / continue文 2)loop
【1】基本
* 以下、公式ドキュメント。
https://jinja.palletsprojects.com/en/3.1.x/
Express | Explanations | Memo |
---|---|---|
{# … #} | Comments | 「【2】コメント文」参照 |
{% … %} | Statements | 「【3】変数」参照 |
{{ … }} | Expressions | 「【4】if文」「【5】for文」参照 |
【2】コメント文
{# コメント文 #} {# コメント文1 コメント文2 #}
https://tekunabe.hatenablog.jp/entry/2021/12/03/jinja2_comment
1)使用上の注意
* コメント文だけの話ではないが出力すると 空白行ができるので「Whitespace Control」を使うといい => 詳細は、以下の関連記事を参照の事
Jinja2 ~ Whitespace Control ~
https://dk521123.hatenablog.com/entry/2024/10/29/151203
【3】変数
* 詳細は、以下の関連記事を参照の事
Jinja2 ~ 変数 ~
https://dk521123.hatenablog.com/entry/2025/04/05/131421
1)変数定義
{% set 変数名 = 変数の値 %} {% set 変数名 %} 変数の値 {% endset %}
2)変数参照
{{ 変数名 }}
【4】if文
* 詳細は以下の関連記事を参照のこと
Jinja2 ~ 条件分岐 ~
https://dk521123.hatenablog.com/entry/2025/04/06/001255
{% if 条件式1 %} {# 条件式1が true なら実行される #} {% elif 条件式2 %} {# 条件式2が true なら実行される #} {% else %} {# 条件式1も2 false なら実行される #} {% endif %}
サンプル
{% if name_val %} <h1>Hello, {{ name_val }}</h1> {% else %} <p>Hello World!</p> {% endif %}
1)論理演算子
* and / or は普通に使える
サンプル
{%- if flg1 and flg2 %} flg1とflg2の値が存在する場合に出力する {%- elif flg1 or flg2 %} flg1またはflg2の値が存在する場合に出力する {%- endif %}
【5】for文
* 詳細は、以下の関連記事を参照の事
Jinja2 ~ 繰り返し ~
https://dk521123.hatenablog.com/entry/2025/04/07/000220
サンプル
{% for name in name_vals: %} <p>Hello, {{ name + " from USA" }}!!!</p> {% endfor %}
1)break / continue文
* if文と組み合わせて使える
break文
{% for item in items %} {% if item == 'TheEnd' %} {% break %} {# ! 注目 ! #} {% endif %} <li>{{ item }}</li> {% endfor %}
continue文
{% for item in items %} {% if item == 'TheSkip' %} {% continue %} {# ! 注目 ! #} {% endif %} <li>{{ item }}</li> {% endfor %}
2)loop
* ループを制御するために用意されている loop が便利。
https://techblog.recochoku.jp/3422
主なメソッド
* 以下の公式ドキュメントに全てのメソッドが載っている
https://jinja.palletsprojects.com/en/3.0.x/templates/#for
Express | Explanations |
---|---|
loop.index | ループのインデックスを返す |
loop.first | 最初のループの場合 True, それ以外は False |
loop.last | 最後のループの場合 True, それ以外は False |
loop.length | ループの回数を返す |
サンプル
{# ループの最後は「,」は要らないので、それを制御する #} CREATE TABLE demo_table {% for column in columns %} {{ column }} TEXT{% "," if not loop.last else "" %} {# ! 注目 ! #} {% endfor %}
参考文献
https://qiita.com/simonritchie/items/cc2021ac6860e92de25d
関連記事
Jinja2 ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/10/19/000848
Jinja2 ~ フィルタ ~
https://dk521123.hatenablog.com/entry/2024/10/20/002622
Jinja2 ~ Macro ~
https://dk521123.hatenablog.com/entry/2023/11/28/235951
Jinja2 ~ 変数 ~
https://dk521123.hatenablog.com/entry/2025/04/05/131421
Jinja2 ~ 繰り返し ~
https://dk521123.hatenablog.com/entry/2025/04/07/000220
Jinja2 ~ 条件分岐 ~
https://dk521123.hatenablog.com/entry/2025/04/06/001255
Jinja2 ~ do文 ~
https://dk521123.hatenablog.com/entry/2025/04/03/221326
Jinja2 ~ Whitespace Control ~
https://dk521123.hatenablog.com/entry/2024/10/29/151203
dbt ~ 条件分岐 ~
https://dk521123.hatenablog.com/entry/2024/09/11/003301
Flask ~ jinja2 ~
https://dk521123.hatenablog.com/entry/2018/09/22/142348
標準テンプレートエンジン
https://dk521123.hatenablog.com/entry/2020/01/07/212138