
dbtでmodelやsourceのベースとなるコードを自動で生成してくれるpackage「codegen」を試してみた #dbt
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
さがらです。
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ファイルのベースを生成するmacrogenerate_base_model:modelファイルのベースを生成するmacrogenerate_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を探して有効活用していきましょう!








