dbtでmodelやsourceのベースとなるコードを自動で生成してくれるpackage「codegen」を試してみた #dbt

2022.07.07

さがらです。

dbt Labs社が提供しているdbt packageの1つ、codegenを試してみたので、その内容をまとめてみます。

codegenとは

codegenに関する情報は、下記ページにまとまっております。

このページの概要文を見ると、

Macros that generate dbt code, and log it to the command line.

…ということで、「codegen」という名の通りdbtのコードを生成してくれるmacroがまとまったpackageです。

より具体的には、下記3つのmacroを含むdbt packageです。

  • generate_source:sourceを定義するyamlファイルのベースを生成するmacro
  • generate_base_model:modelファイルのベースを生成するmacro
  • generate_model_yaml:modelのスキーマ定義を行うyamlファイルのベースを生成するmacro

codegenのインストール

まず、codegenを対象のdbtプロジェクトに対してインストールします。

dbt_project.ymlと同じ階層に、packages.ymlを定義し、以下の内容を記述します。すでにpackages.ymlがある場合は、下記の内容の- package:以降を追記してください。

packages:
  - package: dbt-labs/codegen
    version: 0.7.0

このpackages.ymlの編集と保存後に、dbt depsコマンドを実行します。これでcodegenが使えるようになりました!

試してみた

では早速、codegenに含まれるmacroを試してみた内容を書いていきます!

それぞれのmacroを、dbt run-operationの形でdbt Cloudのコマンドラインから実行してみます。

generate_source

まずは、generate_sourceです。これはsourceを定義するyamlファイルのベースを生成するmacroです。

引数にスキーマ名だけを指定して実行すると、スキーマ名がnameとして記述されたsourceのベースとなるコードがログに出力されます。

dbt run-operation generate_source --args 'schema_name: citibike'

一方で、スキーマ名に加えてデータベース名とテーブル名も引数に指定して実行すると、データベース名がdatabaseとして、テーブル名がtablesとして記述されたコードがログに出力されます。

dbt run-operation generate_source --args '{"schema_name": "CITIBIKE", "database_name": "SAGARA_RAWDATA_DB", "table_names":["STATIONS", "TRIPS"]}'

generate_base_model

続いて、generate_base_modelです。こちらは、sourceを指定してmodel用のSELECT文を生成してくれるmacroです。

generate_base_modelを使うには、sourceを事前に定義しておく必要があります。 せっかくなので、先程generate_sourceで出力されたsourceのコードを用いて、generate_base_modelを使っていきます。

generate_base_modelは、コマンドラインで下記のように入力して実行することで、対象のsourceのテーブルのカラムを全て選択したSELECT文がログに出力されます。

dbt run-operation generate_base_model --args '{"source_name": "citibike", "table_name": "trips"}'

generate_model_yaml

最後に3つ目、generate_model_yamlです、これは、modelのスキーマ定義を行うyamlファイルのベースを生成するmacroです。

generate_model_yamlを使うには、modelを事前に定義しておく必要があります。 先程generate_base_modelで生成したmodelを用いて、generate_model_yamlを実行してみます。

generate_model_yamlは、コマンドラインで下記のように入力して実行することで、対象のmodelのスキーマ定義がされたyaml形式のコードがログに出力されます。(事前に対象のmodelに対してdbt runを行って、オブジェクトを生成していないとエラーとなるためご注意ください。)

dbt run-operation generate_model_yaml --args '{"model_name": "stg_trips"}'

最後に

dbtでmodelやsourceのベースとなるコードを自動で生成してくれるpackage「codegen」を試してみました。

こういったコードをハンド入力しようとすると、結構時間がかかってしまったり、半角スペースを入れ忘れてエラーになってしまう、といったことが考えられます。そのため、こういったpackageを使って楽に自動化できるところは自動化するべきだと思います!

packageは他にも色々とありますので、dbtでの開発中に何か不便に感じることがあればpackageを探して有効活用していきましょう!