こんにちは、六本木アナリティクスエンジニアのTaku(@aelabdata )です。
dbtを使ってデータモデリングをしていると、ソース定義(source.yml)やモデル定義(schema.yml)を書く作業に多くの時間を費やしていませんか?

テーブルやカラムがたくさんあって、手で書くのが面倒…

定義の抜け漏れがないか不安…
こういった課題を解決し、dbtでの開発を圧倒的に効率化してくれるのが、コミュニティで広く使われているパッケージ「dbt-codegen」です。
dbt-codegenは、既存のデータベース情報やdbtモデルをもとに、schema.ymlやsource.ymlといった定義ファイルを自動で生成してくれます。これにより、手作業から解放され、より本質的なモデリング作業に集中できるようになります。
この記事では、dbt-codegenの概要と、マクロの使い方を解説します。
dbt-codegenとは?
dbt-codegenは、dbtプロジェクト内でYAML定義ファイルを自動生成するためのマクロ集です。
使い始めるには、packages.ymlに以下を追記して、dbt depsコマンドを実行するだけです。
packages:
- package: dbt-labs/codegen
version: 0.12.1 # 適切なバージョンを指定してくださいdbt-codegenは、生成されたコードを直接ファイルに書き出す機能は持っていません。そのため、生成されたYAMLをターミナルに出力し、それをコピー&ペーストしてファイルに保存するのが一般的な使い方になります。
マクロの活用ガイド
ここからは、dbt-codegenの主要なマクロをカテゴリー別に紹介します。
これらのマクロは、source.ymlやschema.ymlの作成を自動化します。
- 目的: データベースに存在するテーブルの
source定義(source.yml)を自動で作成します。 - 課題: 新しいデータソースをdbtで扱う際、スキーマ内の複数のテーブルについて、手動で
source定義を書くのは非常に手間がかかります。 - 解決策:
generate_source()マクロを使えば、スキーマ名とテーブル名を指定するだけで、source定義のYAMLコードを自動で出力してくれます。
dbt run-operation generate_source --args '{"schema_name": "jaffle_shop", "table_names": ["customers", "orders"]}'
- 目的: 既存のモデルやテーブルのカラム定義(
schema.yml)を自動で作成します。 - 課題: 複雑なモデルになると、カラム数が多くなり、手動で
nameやdescriptionを定義するのは大変です。 - 解決策:
generate_model_yaml()マクロを使えば、モデル名やテーブル名を指定するだけで、カラムリストを含んだschema.ymlのコードを自動で出力してくれます。
dbt run-operation generate_model_yaml --args '{"model_names": ["stg_customers"]}'
これらのマクロは、モデルのSQLファイル(baseモデル)を自動で生成しxます。
- 目的: ソーステーブルから
baseモデルを自動生成します。 - 課題:
sourceテーブルを一つ一つSELECT文で参照し、カラム名を指定するのは手間がかかります。また、SELECT *だと不要なカラムも含まれてしまいます。 - 解決策:
generate_base_model()マクロを使えば、sourceとテーブル名を指定するだけで、baseモデルのSQLを自動生成します。_fivetran_syncedのようなシステムカラムを自動で除外してくれます。
dbt run-operation generate_base_model --args '{"source_name": "jaffle_shop", "table_name": "customers"}'
- 目的: スキーマ内の全テーブルに対して、
baseモデルをまとめて作成します。 - 課題:
generate_base_modelをテーブルごとに実行するのは非効率です。 - 解決策:
create_base_models()マクロを使えば、指定したスキーマ内の全テーブルに対して、一括でbaseモデルのSQLファイルを生成してくれます。
注: dbt Cloud IDEと互換性がない
dbt run-operation create_base_models --args '{"source_name": "jaffle_shop"}'
- 目的: 複数のモデルやソースを結合する際の
with句(CTE)を自動生成します。 - 課題: 複数のテーブルを
ref()やsource()で参照し、それぞれにCTE名を付けていく作業は、記述量が多くて煩雑です。 - 解決策:
generate_model_import_ctes()マクロを使えば、モデル名とテーブル名を指定するだけで、CTEを自動で生成します。
dbt run-operation generate_model_import_ctes --args '{"model_name": "dim_customers"}'
まとめ:dbt-codegenで「スマートな」dbt開発を
今回は、dbt開発を効率化する強力なツール「dbt-codegen」について解説しました。
- YAML定義ファイルの自動生成:
generate_source(),generate_model_yaml() - SQLモデルの自動生成:
generate_base_model(),create_base_models() - SQLの補助:
generate_model_import_ctes()
これらのマクロを使いこなせば、YAMLファイルの記述や定型的なSQLの作成という手作業から解放され、データモデリングという本来の仕事に集中できます。
この記事が役に立ったと感じたら、ぜひX(@aelabdata)をフォローください!日々のアナリティクスエンジニアとしての学びや、記事の更新情報を発信しています。

