dbt-codegen活用!手作業から解放されるモデル定義ガイド

こんにちは、六本木アナリティクスエンジニアのTaku(@aelabdata )です。

dbtを使ってデータモデリングをしていると、ソース定義(source.yml)やモデル定義(schema.yml)を書く作業に多くの時間を費やしていませんか?

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

定義の抜け漏れがないか不安…

こういった課題を解決し、dbtでの開発を圧倒的に効率化してくれるのが、コミュニティで広く使われているパッケージ「dbt-codegen」です。

dbt-codegenは、既存のデータベース情報やdbtモデルをもとに、schema.ymlsource.ymlといった定義ファイルを自動で生成してくれます。これにより、手作業から解放され、より本質的なモデリング作業に集中できるようになります。

この記事では、dbt-codegenの概要と、マクロの使い方を解説します。

dbt-codegenとは?

dbt-codegenは、dbtプロジェクト内でYAML定義ファイルを自動生成するためのマクロ集です。
使い始めるには、packages.ymlに以下を追記して、dbt depsコマンドを実行するだけです。

packages.yml
packages:
  - package: dbt-labs/codegen
    version: 0.12.1 # 適切なバージョンを指定してください

dbt-codegenは、生成されたコードを直接ファイルに書き出す機能は持っていません。そのため、生成されたYAMLをターミナルに出力し、それをコピー&ペーストしてファイルに保存するのが一般的な使い方になります。

マクロの活用ガイド

ここからは、dbt-codegenの主要なマクロをカテゴリー別に紹介します。

カテゴリー1: YAML定義ファイル生成マクロ

これらのマクロは、source.ymlschema.ymlの作成を自動化します。

generate_source()
  • 目的: データベースに存在するテーブルのsource定義(source.yml)を自動で作成します。
  • 課題: 新しいデータソースをdbtで扱う際、スキーマ内の複数のテーブルについて、手動でsource定義を書くのは非常に手間がかかります。
  • 解決策generate_source()マクロを使えば、スキーマ名とテーブル名を指定するだけで、source定義のYAMLコードを自動で出力してくれます。
dbt run-operation generate_source --args '{"schema_name": "jaffle_shop", "table_names": ["customers", "orders"]}'
generate_model_yaml()
  • 目的: 既存のモデルやテーブルのカラム定義(schema.yml)を自動で作成します。
  • 課題: 複雑なモデルになると、カラム数が多くなり、手動でnamedescriptionを定義するのは大変です。
  • 解決策generate_model_yaml()マクロを使えば、モデル名やテーブル名を指定するだけで、カラムリストを含んだschema.ymlのコードを自動で出力してくれます。
dbt run-operation generate_model_yaml --args '{"model_names": ["stg_customers"]}'

カテゴリー2: SQLモデル生成マクロ

これらのマクロは、モデルのSQLファイル(baseモデル)を自動で生成しxます。

generate_base_model()
  • 目的: ソーステーブルから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"}'
create_base_models()
  • 目的: スキーマ内の全テーブルに対して、baseモデルをまとめて作成します。
  • 課題generate_base_modelをテーブルごとに実行するのは非効率です。
  • 解決策create_base_models()マクロを使えば、指定したスキーマ内の全テーブルに対して、一括でbaseモデルのSQLファイルを生成してくれます。

注: dbt Cloud IDEと互換性がない

dbt run-operation create_base_models --args '{"source_name": "jaffle_shop"}'
generate_model_import_ctes()
  • 目的: 複数のモデルやソースを結合する際の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)をフォローください!日々のアナリティクスエンジニアとしての学びや、記事の更新情報を発信しています。