dbt

dbtのconfig()関数で行うモデル内設定上書き

2026-04-19
NicheeLab編集部

dbtでは、同じ設定キーを複数の場所で定義できます。どこで設定すると、どのように上書きされるのかを正しく理解しておくことは、Analytics Engineer試験でも実務でも重要です。

この記事では、config()関数を使ってモデル内で設定を上書きする際の基本、優先順位、インクリメンタルモデルでの注意点、環境別切り替え、YAMLとの棲み分け、そして試験対策の観点を実務寄りに解説します。

config()の基本と上書き優先順位

config()はモデルファイル内のJinjaブロックで設定を記述する仕組みです。代表例として、materialized、schema、alias、tags、インクリメンタル関連のunique_keyやon_schema_changeなどがあります。

同じキーが複数箇所で定義された場合の優先順位は、一般に次の通りです。低: dbt_project.yml → 中: リソースプロパティYAML(モデルの.yml) → 高: モデル内config()。この優先順位を押さえることで、どこで上書きすべきか迷いません。

  • config()はJinja評価時に解決されるため、モデルSQLの先頭で宣言しておくのが安全
  • 上書きはキー単位。未指定のキーは下位の設定が引き継がれる
  • CLIフラグ(例: --full-refresh)は一部の挙動を別途上書きする特例として理解しておく
設定場所典型用途優先度(低→高)
dbt_project.ymlmodels: my_project: +materialized: viewプロジェクト全体/ディレクトリ単位の既定
リソースYAML(properties)models: - name: fct_orders config: materialized: tableモデル単位の宣言的管理
モデル内config(){{ config(materialized='incremental', schema='mart') }}緊急の個別上書きや条件分岐

設定の上書き優先順位(上ほど強い)

モデル内 config()最優先リソースYAML(properties)dbt_project.yml既定上ほど優先度が高い

最低限のconfig()サンプル

{{ config(
    materialized='table',
    schema='mart',
    alias='orders_daily'
) }}

select * from {{ ref('stg_orders') }}

モデルでよく上書きする設定キー

config()で上書きする頻度が高いのは、materialized、schema、alias、tags、persist_docs(カラム説明の永続化)あたりです。ドキュメント性と運用を意識して選択しましょう。

特にschemaやaliasは命名規約と運用フローに直結します。プロジェクト既定を守りつつ、例外的なモデルのみモデル内で上書きするのが現実的です。

  • materialized: view, table, incremental など
  • schema/alias: 命名・配置の例外対応に有効
  • tags: 選択実行やオーナーシップ管理に便利
  • persist_docs: descriptionをカラムコメントへ反映(対応Warehouseのみ)

代表的なconfig()キーの例

{{ config(
    materialized='view',
    schema='sandbox',
    alias='vw_customer_latest',
    tags=['customer', 'sla_daily'],
    persist_docs={'relation': true, 'columns': true}
) }}

select * from {{ ref('stg_customer') }}

インクリメンタルモデルでのconfig()上書き

インクリメンタルでは、materialized='incremental'に加えて、unique_keyや戦略、on_schema_changeなどを適切に設定します。Warehouse固有の戦略オプション(例: merge、insert_overwrite など)はサポート状況に依存します。

unique_keyは行の同一性を定義し、merge戦略では更新対象カラムの制御(例: merge_update_columns)やスキーマ変更時の扱い(on_schema_change)が重要です。試験では、これらのキーの役割と上書き優先順位が頻出です。

  • unique_key: 行の一意識別(必須かどうかは戦略とWarehouseに依存)
  • incremental_strategy: 代表的にmerge、insert_overwriteなど
  • on_schema_change: ignore / append_new_columns / fail など(サポートはWarehouse依存)

インクリメンタル用config()のひな型

{{ config(
    materialized='incremental',
    unique_key='order_id',
    incremental_strategy='merge',
    on_schema_change='append_new_columns'
) }}

with src as (
  select * from {{ ref('stg_orders') }}
)
select * from src

{% if is_incremental() %}
  -- 例: 直近90日分のみ対象
  where order_date >= dateadd(day, -90, current_date)
{% endif %}

環境別にconfig()で切り替える

target.nameやvar()を用いた条件分岐は、開発・検証・本番でスキーマやマテリアライズ方法を切り替える実務で定番です。Jinjaはパース時に評価されるため、条件はモデル先頭のconfig()ブロックで完結させます。

過度な条件分岐は可読性を下げます。プロジェクト既定はdbt_project.ymlで定め、例外のみconfig()で上書きするのが管理しやすいです。

  • target.nameで環境ごとのスキーマを制御
  • var()で軽微な挙動変更を注入(デフォルト値も用意)
  • 条件はconfig()内に閉じると追跡が容易

環境別切り替えの例

{% set is_heavy = var('heavy_model', false) %}
{% if target.name == 'prod' %}
  {{ config(schema='mart', materialized= 'table' if is_heavy else 'view') }}
{% else %}
  {{ config(schema=target.name ~ '_mart', materialized='view') }}
{% endif %}

select * from {{ ref('stg_heavy_fact') }}

YAMLとモデル内config()の棲み分け

変更頻度が低く説明的な設定(例: persist_docs、タグ、オーナー、契約など)はYAMLに寄せると見通しが良くなります。一方で、実行戦略に密接な一時的・例外的な上書きはモデル内config()が扱いやすいです。

試験では「どこに何を書くのが適切か」を問う設問が出ます。プロジェクト既定はdbt_project.yml、モデル固有の静的メタはYAML、環境や戦略の例外はconfig()という三層で整理しておくと回答が安定します。

  • 静的メタ・説明はYAML、挙動の例外はconfig()
  • 規約はdbt_project.ymlで集約し、逸脱は最小限に
  • レビュー時はモデル先頭のconfig()とYAMLをセットで確認

YAMLとconfig()の対比例

# models/schema.yml
models:
  - name: fct_orders
    description: 受注ファクト。
    config:
      tags: ['finance']

-- models/fct_orders.sql
{{ config(materialized='incremental', unique_key='order_id') }}
select * from {{ ref('stg_orders') }}

試験対策と実務ベストプラクティス

Analytics Engineer試験では、設定の優先順位、インクリメンタルの必須キー、on_schema_changeの意味、config()を置く位置などが問われます。特定のWarehouse固有オプションは出題されても一般論で解ける範囲で設問が組まれやすいです。

実務では、プロジェクト既定を強くし、例外はモデル側に閉じ、PRレビューで意図の可視化(なぜ上書きが必要か)をコメントに残す運用が効きます。

  • 優先順位: dbt_project.yml < YAML properties < モデル内config()
  • インクリメンタル: unique_keyの意味と戦略の相性を説明できること
  • config()はモデル先頭のJinjaブロックで宣言し、条件分岐は最小限に

レビューで差がつく最小上書きパターン

{{ config(materialized='incremental', unique_key='id') }}
-- 既定のschema/alias/tagsはdbt_project.yml/YAMLに任せ、
-- ここでは戦略に直結するキーのみ上書き
select * from {{ ref('stg_dim_user') }}

問題で確認

Analytics Engineer

問題 1

組織の既定ではmodels以下はすべてviewですが、特定のモデルだけtableにしたい。最も高い優先度で個別上書きし、かつ影響範囲を最小限にする方法はどれか。

  1. モデルSQLの先頭でconfig(materialized='table')を宣言する
  2. dbt_project.ymlでmodels以下をtableに変え、例外はYAMLでviewに戻す
  3. リソースYAMLでmaterialized: tableを設定し、SQL内では何もしない
  4. CLIで--full-refreshを付けて実行する

正解: A

設定の優先順位はdbt_project.yml < リソースYAML < モデル内config()。影響範囲を最小にし最優先で上書きするには、モデル内config()でmaterialized='table'を指定するのが正解。--full-refreshは実行時の再作成動作であり恒常的なマテリアライズ種別の設定ではない。

よくある質問

config()はモデルファイルのどこに書くべきですか?

Jinja評価時に解決されるため、モデルSQLの先頭でトップレベルのJinjaブロックとして宣言するのが推奨です。後段に書くと可読性が落ち、意図しない条件分岐の混入リスクが上がります。

config()とYAMLの両方に同じキーがある場合、どちらが有効ですか?

一般的な優先順位は、dbt_project.yml < リソースYAML < モデル内config()です。両方に同じキーがある場合、モデル内config()が有効になります。

インクリメンタルでunique_keyは常に必須ですか?

戦略とWarehouse依存です。merge戦略では更新の突き合わせにunique_keyを指定するのが通例です。サポート内容はターゲットWarehouseのドキュメントとdbtの公式ドキュメントを確認してください。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
dbt

dbt Model の基礎: SQL で定義する変換の最小単位

Analytics Engineer 向けに、dbt Model の定義、マテリアライゼーション、依存関係、インクリメン...

dbt

dbt Analytics Engineer 試験ガイド: 出題範囲・配点・申込の実務視点

dbt Analytics Engineer 認定の出題範囲、配点の考え方、申込から受験までの流れを、公式ドキュメントの...

dbt

dbt Cloud と dbt Core の違いと選び方:Analytics Engineer 試験に効く要点

dbt Cloud と dbt Core の機能差を、実務と資格対策の両面から整理。スケジューリング、IDE、RBAC、...

dbt

dbt プロジェクト構造ガイド: models / seeds / macros の実務レイアウト

Analytics Engineer 向けに、dbt プロジェクトのディレクトリ構造と命名規約、dbt_project....

dbt

dbt_project.yml の読み方:主要設定と命名を最短で掴む

dbt_project.yml の必須キー、命名解決(database.schema.identifier)、設定優先度...

dbtの記事一覧 (100件)
© 2026 NicheeLab All rights reserved.