dbtでは、同じ設定キーを複数の場所で定義できます。どこで設定すると、どのように上書きされるのかを正しく理解しておくことは、Analytics Engineer試験でも実務でも重要です。
この記事では、config()関数を使ってモデル内で設定を上書きする際の基本、優先順位、インクリメンタルモデルでの注意点、環境別切り替え、YAMLとの棲み分け、そして試験対策の観点を実務寄りに解説します。
config()はモデルファイル内のJinjaブロックで設定を記述する仕組みです。代表例として、materialized、schema、alias、tags、インクリメンタル関連のunique_keyやon_schema_changeなどがあります。
同じキーが複数箇所で定義された場合の優先順位は、一般に次の通りです。低: dbt_project.yml → 中: リソースプロパティYAML(モデルの.yml) → 高: モデル内config()。この優先順位を押さえることで、どこで上書きすべきか迷いません。
| 設定場所 | 例 | 典型用途 | 優先度(低→高) |
|---|---|---|---|
| dbt_project.yml | models: my_project: +materialized: view | プロジェクト全体/ディレクトリ単位の既定 | 低 |
| リソースYAML(properties) | models: - name: fct_orders config: materialized: table | モデル単位の宣言的管理 | 中 |
| モデル内config() | {{ config(materialized='incremental', schema='mart') }} | 緊急の個別上書きや条件分岐 | 高 |
設定の上書き優先順位(上ほど強い)
最低限のconfig()サンプル
{{ config(
materialized='table',
schema='mart',
alias='orders_daily'
) }}
select * from {{ ref('stg_orders') }}config()で上書きする頻度が高いのは、materialized、schema、alias、tags、persist_docs(カラム説明の永続化)あたりです。ドキュメント性と運用を意識して選択しましょう。
特にschemaやaliasは命名規約と運用フローに直結します。プロジェクト既定を守りつつ、例外的なモデルのみモデル内で上書きするのが現実的です。
代表的な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') }}インクリメンタルでは、materialized='incremental'に加えて、unique_keyや戦略、on_schema_changeなどを適切に設定します。Warehouse固有の戦略オプション(例: merge、insert_overwrite など)はサポート状況に依存します。
unique_keyは行の同一性を定義し、merge戦略では更新対象カラムの制御(例: merge_update_columns)やスキーマ変更時の扱い(on_schema_change)が重要です。試験では、これらのキーの役割と上書き優先順位が頻出です。
インクリメンタル用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 %}target.nameやvar()を用いた条件分岐は、開発・検証・本番でスキーマやマテリアライズ方法を切り替える実務で定番です。Jinjaはパース時に評価されるため、条件はモデル先頭のconfig()ブロックで完結させます。
過度な条件分岐は可読性を下げます。プロジェクト既定はdbt_project.ymlで定め、例外のみ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') }}変更頻度が低く説明的な設定(例: persist_docs、タグ、オーナー、契約など)はYAMLに寄せると見通しが良くなります。一方で、実行戦略に密接な一時的・例外的な上書きはモデル内config()が扱いやすいです。
試験では「どこに何を書くのが適切か」を問う設問が出ます。プロジェクト既定はdbt_project.yml、モデル固有の静的メタはYAML、環境や戦略の例外はconfig()という三層で整理しておくと回答が安定します。
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レビューで意図の可視化(なぜ上書きが必要か)をコメントに残す運用が効きます。
レビューで差がつく最小上書きパターン
{{ 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にしたい。最も高い優先度で個別上書きし、かつ影響範囲を最小限にする方法はどれか。
正解: 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の公式ドキュメントを確認してください。
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)、設定優先度...