dbt_project.yml はプロジェクト全体の“設計図”です。モデルの既定マテリアライゼーション、スキーマ命名、パス構成、マクロのディスパッチ戦略など、実行時の挙動を大きく左右します。
本記事では、Analytics Engineer 試験対策にも直結する安定的な概念に絞って解説します。バージョン固有の仕様に依存せず、公式ドキュメントの一般的な前提に沿って説明します。
dbt_project.yml はプロジェクトのメタ情報と既定設定を宣言します。最低限、プロジェクト名、バージョン、使用するプロファイル名、設定ファイルのフォーマットバージョン(一般的には 2)を定義します。
パス系(models, seeds, snapshots, tests, macros など)は既定値があるため省略可能ですが、チームでの可読性や CI の安定性を考えると明示しておくのが無難です。
| キー | 例 | ポイント |
|---|---|---|
| name | my_dbt_proj | unique_id に含まれる。改名は影響範囲が大きい |
| version | 1.0.0 | プロジェクトの論理バージョン。パッケージ配布時にも意味を持つ |
| profile | warehouse_default | 接続先(profiles.yml)と対応。環境により target が切り替わる |
| config-version | 2 | 現行の設定フォーマット。2 を使うのが一般的 |
| model-paths | ['models'] | 省略可(既定あり)。明示すると可読性が上がる |
dbt_project.yml からリレーション名が決まるまで
最小〜基本の dbt_project.yml 例
name: my_dbt_proj
version: 1.0.0
config-version: 2
profile: warehouse_default
model-paths: ["models"]
seed-paths: ["seeds"]
snapshot-paths: ["snapshots"]
test-paths: ["tests"]
macro-paths: ["macros"]
require-dbt-version: ">=1.3.0"
quoting:
database: false
schema: false
identifier: false
models:
my_dbt_proj:
+materialized: view
命名規約はクエリ可読性と運用コストに直結します。特にモデル名(ファイル名)、alias、schema の整合を意識し、ディレクトリごとに既定設定(materialized, schema など)を与えると管理しやすくなります。
seeds や snapshots も dbt_project.yml のブロックで既定設定をまとめておくと、方針のズレを防げます。
| リソース | 既定のパスキー | 既定/配置 | 主な上書き設定(例) |
|---|---|---|---|
| models | model-paths | view(既定) | +materialized, +schema, +alias, +database, tags |
| seeds | seed-paths | テーブルとしてロード | delimiter, quote_columns, column_types, +schema, +database |
| snapshots | snapshot-paths | snapshot テーブル | target_schema, target_database |
| tests | test-paths | 汎用/単体テスト定義 | severity, store_failures, +schema(適用可) |
推奨ディレクトリ構成(例)
project_root/
models/
staging/
intermediate/
marts/
seeds/
snapshots/
tests/
macros/
target/ (生成物)
dbt_packages/ (依存パッケージ)パスと命名規約の例(プロジェクト既定)
models:
my_dbt_proj:
+materialized: view
staging:
+schema: stg
+tags: [staging]
marts:
+materialized: table
+schema: marts
+tags: [prod]
seeds:
my_dbt_proj:
+schema: seed
quote_columns: true
delimiter: ","
snapshots:
my_dbt_proj:
target_schema: snap
dbt の設定は“どこに書いたか”で優先度が異なります。試験で狙われやすいのは、この優先度と alias/schema の解決順序です。
基本原則として、より近い(ローカルな)定義が強く、CLI での明示指定が最優先になります。
| 層 | 例 | いつ使う |
|---|---|---|
| CLI | dbt run --full-refresh | 一時的な上書き。CI/CD 分岐など |
| リソース内 | models/.../model.sql 内の config(materialized='table') | 個別モデルだけ特別扱い |
| プロジェクト | dbt_project.yml の models: ブロック | ディレクトリ単位で既定化 |
| パッケージ | 依存パッケージの設定 | 外部提供の既定(上書き可能) |
| 既定値 | materialized = view など | 未指定時のフォールバック |
設定優先度の“段々畑”イメージ
優先度の違いが分かるサンプル
# models/marts/orders.sql
{{ config(materialized='table', alias='fct_orders') }}
select * from {{ ref('int_orders') }}
# dbt_project.yml(抜粋)
models:
my_dbt_proj:
marts:
+materialized: view # ← リソース内 config がこれを上書き
+schema: marts
スキーマは target(profiles.yml の target 設定)とプロジェクト側の +schema、それを束ねるマクロ generate_schema_name で決まります。既定の実装では、+schema を与えると target.schema に接尾して結合する挙動が一般的です。
チームで“接尾結合”か“完全置換”かを明示し、必要であればマクロを上書きすると事故を防げます。
| アプローチ | 特徴 | 注意点/長所 |
|---|---|---|
| 既定(接尾結合) | target.schema + '_' + custom | prod/dev 共通の custom でも衝突しにくい |
| 完全置換 | custom をそのまま返す | 移行時は既存スキーマ名との整合に注意 |
| 環境サフィックス | target 側で env を付与 | dbt_project.yml はシンプル、profiles.yml の管理が肝 |
環境とカスタムスキーマの組み合わせ例
target.schema = analytics
+schema = stg
既定: analytics_stg
完全置換: stg
環境サフィックス例: analytics_dev_stggenerate_schema_name の上書き例(完全置換)
{% macro generate_schema_name(custom_schema_name, node) %}
{# 完全置換:custom_schema_name があればそれを使い、なければ target.schema #}
{% if custom_schema_name is not none %}
{{ custom_schema_name }}
{% else %}
{{ target.schema }}
{% endif %}
{% endmacro %}
# dbt_project.yml(例)
models:
my_dbt_proj:
staging:
+schema: stg
vars はマクロ・モデルから参照するパラメータ置き場です。dispatch はマクロ解決の探索順を制御し、アダプタや自作パッケージとの共存を助けます。
互換性と安全性のために require-dbt-version で実行バージョンを固定し、quoting・on-run-*・clean-targets なども明示しましょう。
| キー | 用途 | 試験で問われがち |
|---|---|---|
| dispatch | マクロ探索順序の制御 | dbt → カスタムの検索順が問われる |
| vars | マクロ/モデルに値注入 | env_var との併用とデフォルト値 |
| require-dbt-version | 実行バージョンの固定 | 範囲表記(>=, <)の意味 |
| quoting | 識別子の引用符制御 | identifier/schema/database ごとに独立 |
| on-run-start/end | 実行前後フック | 監査テーブルや権限設定の自動化 |
マクロ解決のディスパッチ順序
拡張系設定の例
dispatch:
- macro_namespace: dbt
search_order: [my_pkg, dbt]
vars:
country: "JP"
run_ts: "{{ var('override_ts', env_var('RUN_TS', '1970-01-01')) }}"
require-dbt-version: ">=1.3.0,<2.0.0"
quoting:
database: false
schema: false
identifier: false
on-run-start:
- "{{ log('Run started at ' ~ run_started_at, info=True) }}"
clean-targets: ["target", "dbt_packages"]
packages-install-path: "dbt_packages"
Analytics Engineer 試験では、設定優先度・スキーマ/識別子命名・seeds/snapshots の既定と上書きの関係が頻出です。以下のチェックで理解の穴を塞ぎましょう。
特に alias と ref の関係、+schema と generate_schema_name の既定挙動、seeds の quote_columns 既定は混同しやすいポイントです。
| よくある誤解 | 正しい理解 | 根拠/ヒント |
|---|---|---|
| alias を変えると ref 名も変わる | ref はノード名で解決。alias は物理名のみ | 公式の参照解決は unique_id ベース |
| +schema は target.schema を置換する | 既定では target.schema に接尾結合されることが多い | generate_schema_name の既定実装 |
| seeds は未指定だと列が非クオート | 既定で列名クオート(多くのアダプタで true) | プロジェクトで明示推奨 |
実行フローのざっくり像
seeds と tests の実務設定例
seeds:
my_dbt_proj:
+schema: seed
quote_columns: true
delimiter: ","
column_types:
id: integer
amount: numeric
tests:
+severity: warn
+store_failures: true
+schema: test_audit
Analytics Engineer
問題 1
profiles.yml で target.schema が analytics、dbt_project.yml の models: で +schema: stg を付けた場合、既定の generate_schema_name 実装を用いると、モデルが作成されるスキーマはどれか?
正解: C
既定の generate_schema_name は、custom schema が指定された場合に target.schema に接尾結合する実装が一般的です。そのため analytics_stg となります(完全置換にしたい場合はマクロを上書き)。
dbt_project.yml の name を後から変えても大丈夫?
技術的には可能ですが、unique_id(resource_type.package.name)が変わるため、artifact 連携やテスト選択子、ドキュメント生成に影響します。運用中の改名は計画的に。
alias を設定すると ref() の呼び出し名も alias に合わせる必要がある?
不要です。ref はノード(モデルファイル)の名前で解決します。alias は物理テーブル/ビュー名のみを変更します。
seeds の列クオートと大文字小文字はどう扱えばよい?
quote_columns の既定は true である実装が一般的です。アダプタの識別子規則に依存するため、プロジェクトで quote_columns と列名の正規化方針を明示しましょう。
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)、設定優先度...