【Python】Jinja2 ~ 基本編 ~

■ はじめに

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