## What — source と model の違い
違いは「何を指しているか」と「どう参照するか」に出る。
| | source(sources.yml) | model(schema.yml) |
|---|---|---|
| 対象 | **外部テーブル**(BigQueryに直接生成されたテーブルなど) | **dbtモデル**(.sqlファイル) |
| 参照 | `source()` 関数 | `ref()` 関数 |
| フック | `pre-hook` は定義できない | `post-hook` を定義できる(`pre-hook` は非推奨) |
| その他 | — | テスト、ドキュメントを追加できる |
**sourceで読み込むには、必ずYAMLファイルが必要**。ファイル名は任意(例:`staging.raw_data.yml`、`sources.yml`)で、モデルファイルと同じディレクトリ、または `models/` 配下に置く。
## How — 基本構造とファイル配置
sources.yml(ソース定義)。
```yaml
version: 2
sources:
- name: raw_data # ソース名(任意)
description: "Raw data from BigQuery"
database: your_project
schema: staging
tables:
- name: raw_table_name # 実際のテーブル名
description: "Description of the table"
# カラムの定義(オプション)
columns:
- name: column1
description: "Description of column1"
```
schema.yml(モデル定義)。`name` は `.sql` ファイル名と一致させる。
```yaml
version: 2
models:
- name: model_name
description: "Description of the model"
config:
materialized: table # view, table, incremental など
# ⚠️ pre-hook は使わない(SQLファイル内で処理する)
columns:
- name: id
description: "Primary key"
tests:
- unique
- not_null
```
配置は `models/staging/` のように**モデルファイル(.sql)と同じディレクトリに置くのが安全**。ファイル作成場所のミスは、dev環境でファイルが見つからないエラーとして出てくる。
> [!warning] よくあるエラー3つ
> - `Source 'raw_data' not found` … `sources.yml` が無い / テーブル名が違う。ソース定義を作り直す
> - `File not found in dev_<自分のユーザー名>` … ファイルの配置場所、プロジェクトルートからの相対パス、`dbt_project.yml` の設定を確認
> - `Invalid YAML syntax` … インデントはスペース2つ、`version: 2` を忘れない、コロンの後にスペースを入れる
実践の順番は4ステップ。
1. `models/staging/<ソース>.yml` を作って `dbt compile` で構文チェック
2. `models/staging/<モデル>.yml` を作ってテストを追加
3. `.sql` から `{{ source('raw_data', 'raw_data') }}` で参照
4. `dbt run --select <モデル>` と `dbt test --select <モデル>` で確認
## 関連
- [[データ基盤]]
- [[dbtでpre-hookを使わずSQL側で処理する]] — pre-hook が非推奨な理由と代替3手
- [[dbtのYAMLで主キーとテストを書く]] — `primary_key` テストと複合主キー
- [[BigQuery]] — source が指す先になることが多いデータウェアハウス