dbt の var() は、Jinja コンパイル時に参照される実行時パラメータです。モデルやマクロの分岐、しきい値、日付境界などを柔軟に切り替えるのに使います。
本稿では、試験対策(dbt Analytics Engineer)と実務の両面から、変数の優先順位・設計原則・具体実装・検証方法・運用までを整理します。
var('name', default) は Jinja コンパイル時に解決される変数参照です。default を指定しない場合、その変数が見つからなければコンパイルエラーになります。default を指定すると未設定時でもビルドが継続し、明示的な初期値で動作します。
変数の設定は主に dbt_project.yml の vars と CLI の --vars で行います。どちらにも同名キーがある場合は CLI が優先されます。パッケージが var() を参照している場合は、ルートプロジェクトの dbt_project.yml でそのパッケージ用の名前空間配下に値を与えると上書きできます。
| 設定場所 | 記述例 | 優先度 | 主な用途 |
|---|---|---|---|
| CLI --vars | dbt run --vars "{start_date: '2024-01-01', use_new_logic: true}" | 最優先 | 一時的上書き、CI/CD での切替 |
| dbt_project.yml vars(ルート) | vars:\n start_date: '2021-01-01'\n use_new_logic: false | 中 | 既定値の集中管理、チーム標準の定義 |
| パッケージ変数上書き | vars:\n some_package:\n enable_feature: true | 中(対象は該当パッケージ) | 外部パッケージの既定動作の上書き |
| var() の default | {{ var('start_date', '1900-01-01') }} | 最下位 | 安全なフォールバック、コンパイルエラー回避 |
変数は“最小限かつ明確”が基本です。実行時パラメータ化するものは、再デプロイなしで頻繁に変えたい閾値やスイッチに限定します。変数が多すぎるとテスト行列が爆発します。
型と命名は将来の保守性に直結します。真偽値・日付・数値・列挙などの型を明示し、default はテスト可能で安全な最小権限の値に設定します。
以下は、既定値を dbt_project.yml に定義し、モデル内で var() を使って条件分岐・日付境界を切り替える最小例です。CI では CLI --vars で一時的に上書きします。
日付リテラルを SQL に埋め込む際は、方言に合わせてクォート・キャストを適切に行います(Snowflake なら TO_DATE、Databricks なら DATE() など)。
dbt_project.yml・モデル・CLI の連携例
# dbt_project.yml(抜粋)\nname: my_project\nversion: 1.0.0\nconfig-version: 2\n\nvars:\n start_date: '2021-01-01'\n use_new_logic: false\n\nmodels:\n my_project: {+materialized: table}\n\n---\n-- models/fct_orders.sql(抜粋)\n{{ config(materialized='table') }}\n\nwith src as (\n select * from {{ ref('stg_orders') }}\n {% if var('use_new_logic', false) %}\n where updated_at >= '{{ var('start_date', '1900-01-01') }}'\n {% endif %}\n)\n\nselect * from src\n\n---\n# 一時的に上書き(CI など)\n# Linux/macOS の例(シェルでクォートに注意)\ndbt build --vars "{use_new_logic: true, start_date: '2024-01-01'}"外部パッケージ(例: dbt-utils 等)が var() を参照している場合、ルートプロジェクトの dbt_project.yml にパッケージ名の名前空間を作り、配下にキーを定義することで動作を上書きできます。
この仕組みはパッケージの既定動作を安全に変更する標準的手段です。上書きの有無を README に記録し、バージョンアップ時に差分をレビューできるようにします。
パッケージ変数の上書き例(dbt_project.yml)
vars:\n some_package:\n enable_feature: true\n threshold: 10重要な変数は、コンパイル時に許容値チェックを行うと安全です。想定外の値が混入した際に早期失敗し、誤った SQL の実行を防げます。dbt では exceptions.raise_compiler_error を用いて明示的に失敗させられます。
Jinja の真偽判定は Python に準じるため、"false" のような非空文字列は真と評価されます。真偽値は必ず boolean 型で与え、CLI でも true/false を YAML として解釈されるよう適切にクォートしてください。
コンパイル時ガードのマクロ例
{% macro require_valid_choice(var_name, allowed) %}\n {% set value = var(var_name, none) %}\n {% if value is none or value not in allowed %}\n {{ exceptions.raise_compiler_error(var_name ~ ' must be one of ' ~ (allowed | join(', ')) ~ ', but was: ' ~ (value|string)) }}\n {% endif %}\n{% endmacro %}\n\n-- 利用例(モデル先頭など)\n{{ require_valid_choice('region', ['us', 'eu', 'ap']) }}環境(dev/stg/prod)ごとの動作差分は、基本は接続プロファイルや target で吸収し、ビジネスロジック上の可変部分のみ var で切り替えます。CI では --vars で主要な組合せを検証します。
下図は var の解決フローのイメージです。CLI があればそれが最優先、なければ dbt_project.yml、最後に default が使われ、コンパイル結果の SQL に反映されます。
var の解決フロー(優先順位と反映経路)
GitHub Actions での例(主要フラグを 2 通り検証)
jobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - uses: actions/setup-python@v5\n with: { python-version: '3.11' }\n - run: pip install dbt-core dbt-snowflake\n - name: Build (use_new_logic=false)\n run: dbt build --vars "{use_new_logic: false, start_date: '2021-01-01'}"\n - name: Build (use_new_logic=true)\n run: dbt build --vars "{use_new_logic: true, start_date: '2024-01-01'}"Analytics Engineer
問題 1
モデル内で {{ var('start_date', '1900-01-01') }} を参照している。dbt_project.yml には start_date: '2021-01-01' が設定され、実行時に dbt run --vars "{start_date: '2022-01-01'}" を指定した。実際に使用される値はどれか。
正解: C
var の優先順位は CLI --vars > dbt_project.yml vars > var() の default。したがって '2022-01-01' が採用される。
vars と env_var の違いは?どちらを使うべきですか?
vars はビジネスロジックの実行時パラメータ(フラグや閾値)を扱い、dbt_project.yml や CLI --vars で設定します。env_var は環境変数を参照する関数で、資格情報やシークレット、接続先など機密性の高い値に適します。機密情報は vars ではなく env_var を使ってください。
profiles.yml に vars を書けますか?
いいえ。vars は dbt_project.yml の vars と CLI --vars で管理します。profiles.yml は接続情報(アカウント、ユーザー、ロール、倉庫など)を定義する場所であり、ビジネスロジックのパラメータは含めません。
--vars の型はどう解釈されますか?
YAML/JSON 準拠で解釈されます。true/false は boolean、数値は number、文字列はクォートが必要です。例: dbt run --vars "{use_new_logic: true, threshold: 10, start_date: '2024-01-01'}"。誤って 'false' のような文字列を渡すと真と評価されるため注意してください。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
dbt Model の基礎: SQL で定義する変換の最小単位
Analytics Engineer 向けに、dbt Model の定義、マテリアライゼーション、依存関係、インクリメン...
dbt Analytics Engineer 試験ガイド: 出題範囲・配点・申込の実務視点
dbt Analytics Engineer 認定の出題範囲、配点の考え方、申込から受験までの流れを、公式ドキュメントの...
dbt Cloud と dbt Core の違いと選び方:Analytics Engineer 試験に効く要点
dbt Cloud と dbt Core の機能差を、実務と資格対策の両面から整理。スケジューリング、IDE、RBAC、...
dbt プロジェクト構造ガイド: models / seeds / macros の実務レイアウト
Analytics Engineer 向けに、dbt プロジェクトのディレクトリ構造と命名規約、dbt_project....
dbt_project.yml の読み方:主要設定と命名を最短で掴む
dbt_project.yml の必須キー、命名解決(database.schema.identifier)、設定優先度...