## 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 が指す先になることが多いデータウェアハウス