【dbt】dbt ~ 条件分岐 ~

■ はじめに

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

目次

【1】if文
【2】関連するDBTマクロ
 1)is_incremental()
 2)load_relation
 3)run_query()

【1】if文

* 基本、Pythonのテンプレートエンジン「jinja2(神社2)」と同じ

1)構文

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

【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()

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

* SQL実行

サンプル

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

使用上の注意

* 結果が大量に返ってくるような結果を変数に入れると
 メモリ不足で落ちる可能性がある
 => 実際にあった事象は、以下の関連記事の
 「【1】Airflow + dbt でエラー「Task exited with return code -9」」を参照のこと

動的なdbt 実行時でのトラブル
https://dk521123.hatenablog.com/entry/2024/09/10/145921

関連記事

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 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
Jinja ~ マクロ ~
https://dk521123.hatenablog.com/entry/2023/11/28/235951