【dbt】dbt ~ SQL実行関数 / run_query ~

◾️はじめに

今回は、dbt Model / Macro内でSQL実行するための関数「run_query」
およびその周辺で使うTipsなどなどについてメモっておく

目次

【1】run_query関数
【2】set関数
 設定方法1:set xxx="xxx"
 設定方法2:set xxx ... endset
【3】execute変数
 1)if execute
【4】サンプル
 例1:SELECT文の実行するマクロ
【5】使用上の注意

【1】run_query関数

* マクロ内からSQL実行するための関数

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

{% macro hello_world() %}
  {% set sql %}
    SELECT 1
  {% endset %}

  {% do run_query(sql) %}
  {% do log("Hello World", info=True) %}
{% endmacro %}

【2】set関数

* 変数に値を設定する
 => 変数にSQL文を設定し、run_queryで実行する

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

設定方法1:set xxx="xxx"

{% set value = "Hello World" %}

設定方法2:set xxx ... endset

{% set value %}
    Hello World
{% endset %}

【3】execute変数

* dbtの「コンパイル」フェーズ(execute=False)と
 「実行」フェーズ(execute=True)を区別するために使う

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

1)if execute

* dbtのマクロ内で実際にクエリを実行するかどうかを制御するために使用

2)どういった時に使うか?

* 以下「【修正前】models/demo.sql」をコンパイルすると
 「Compilation Error」が発生してしまう

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

【修正前】models/demo.sql

{% set query %}
select distinct
id
from my_first_dbt_model
{% endset %}

{% set results = run_query(query) %}
{# Return the first column #}
{% set payment_methods = results.columns[0].values() %}

コマンド例:Compilation Error

$ dbt compile -q
13:44:32  Encountered an error:
Compilation Error in model demo (models/demo.sql)
  'None' has no attribute 'table'. This can happen when calling a macro that does not exist. Check for typos and/or install package dependencies with "dbt deps".

【修正後】models/demo.sql

{% set query %}
select distinct
id
from my_first_dbt_model
{% endset %}

{% set results = run_query(query) %}
{# Return the first column #}
{% if execute %}
  {% set payment_methods = results.columns[0].values() %}
{% else %}
  {% set payment_methods = [] %}
{% endif %}

【4】サンプル

例1:SELECT文の実行するマクロ

* テストデータは以下の関連記事を参照の事

https://dk521123.hatenablog.com/entry/2025/04/26/234102

macro/demo_macro.sql

{% macro demo_macro(target_table) -%}
  {% set query %}
    SELECT * FROM {{ target_table }}
  {% endset %}

  {% set results = run_query(query) %}
  {{ log("Results: " ~ results.columns[0].values(), True) }}
{% endmacro %}

コマンド例

$ dbt run-operation demo_macro --args '{target_table: daily_sample_user}' 
13:02:11  Running with dbt=1.9.4
13:02:11  Registered adapter: postgres=1.9.0
13:02:11  Found 2 models, 4 data tests, 434 macros
13:02:11  Results: ('X001', 'X002', 'X003', 'X004', 'X005')

【5】使用上の注意

* 結果が大量に返ってくるような結果を変数に入れると
 メモリ不足で落ちる可能性がある
 => 実際にあった事象は、以下の関連記事の
 「【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/06/30/000000
dbt ~ 環境設定編 ~
https://dk521123.hatenablog.com/entry/2023/12/16/152147
dbt ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/05/30/151003
dbt Macro ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/11/29/003751
dbt Macro ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2024/10/22/002940
dbt Macro ~ DWHごとに処理切替 / adapter.dispach ~
https://dk521123.hatenablog.com/entry/2024/08/20/150724
dbt ~ 条件分岐 ~
https://dk521123.hatenablog.com/entry/2024/09/11/003301
dbt CLI ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/07/21/234811
Python with dbt ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/07/20/034930
Python with dbt ~基本編 ~
https://dk521123.hatenablog.com/entry/2025/04/26/234102
動的なdbt 実行時でのトラブル
https://dk521123.hatenablog.com/entry/2024/09/10/145921