【dbt】dbt ~ 条件分岐 ~

■ はじめに

dbt を解析しなくてはならず、その中で if文で分岐している箇所があったので
それに付随するTipsなどをまとめておく

目次

【1】if文
 1)構文
 2)演算子
【2】関連するDBTマクロ
 1)is_incremental()
 2)load_relation
 3)run_query()
【3】Tips
 1)Noneチェック

【1】if文

* 基本、Pythonのテンプレートエンジン「jinja2(神社2)」と同じ
 => 詳細は、以下の関連記事を参照のこと

Jinja2 ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2024/10/18/001757

1)構文

# Statements {% ... %}
# Comments {# ... #}
{% if 条件式1 %}
  {# 条件式1が true なら実行される #}
{% elif 条件式2 %}
  {# 条件式2が true なら実行される #}
{% else %}
  {# 条件式1も2 false なら実行される #}
{% endif %}

2)演算子

演算子 説明
== 等価比較
!= 非等価比較
and 論理積
or 論理和
not 否定

【2】関連するDBTマクロ

1)is_incremental()

* materialized='incremental' 時でのテーブルの存在チェックで使用する
* True / False で返す

https://docs.getdbt.com/docs/build/incremental-models#understand-the-is_incremental-macro

* 以下の条件を当てはまる場合、True になる
 + テーブルが既に存在する場合
 + 「full-refresh」モードで動いていない
 + materialized='incremental'

* materialized='incremental'については、以下の関連記事を参照のこと

dbt ~ 更新 / 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2023/12/07/060129

2)load_relation

https://docs.getdbt.com/reference/dbt-jinja-functions/adapter#load_relation

* テーブルの存在チェックで使用する
 => あれば Relation object(※1), なければ、Noneを返す
 => コード見た方が理解が早い

※1:Relation object
https://docs.getdbt.com/reference/dbt-classes#relation

サンプル

{% set has_exists = load_relation(ref('demo_model')) is not none %}
{% if has_exists %}
      {{ log("demo_model has already been built", info=true) }}
{% else %}
      {{ log("demo_model doesn't exist in the warehouse. Maybe it was dropped?", info=true) }}
{% endif %}

3)run_query()

* SQL実行

https://docs.getdbt.com/reference/dbt-jinja-functions/run_query

* 詳細は、以下の関連記事を参照の事

dbt ~ SQL実行関数 / run_query ~
https://dk521123.hatenablog.com/entry/2025/04/28/000032
サンプル

{% set table_count=run_query('SELECT COUNT(*) FROM demo_db.demo_schema.demo_table') %}
{% if table_count.columns[0].values()[0]>0 %}

【3】Tips

1)Noneチェック

* "none" でチェックするので注意

サンプル

    {%- if value is none -%}
        ...
    {%- endif -%}

関連記事

dbt ~ 環境設定編 ~
https://dk521123.hatenablog.com/entry/2023/12/16/152147
dbt ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2023/06/30/000000
dbt ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/05/30/151003
dbt ~ SQL実行関数 / run_query ~
https://dk521123.hatenablog.com/entry/2025/04/28/000032
dbt Macro ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/11/29/003751
dbt ~ 更新 / 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2023/12/07/060129
動的なdbt 実行時でのトラブル
https://dk521123.hatenablog.com/entry/2024/09/10/145921
Flask ~ jinja2 ~
https://dk521123.hatenablog.com/entry/2018/09/22/142348
Jinja2 ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/10/19/000848
Jinja2 ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2024/10/18/001757
Jinja2 ~ Macro ~
https://dk521123.hatenablog.com/entry/2023/11/28/235951
Jinja2 ~ Whitespace Control ~
https://dk521123.hatenablog.com/entry/2024/10/29/151203