[新機能]dbt Cloudで本番環境とのdefer(差分)を取得して新規開発したモデルだけを開発環境でbuildできるようになりました

2023.10.17

さがらです。

dbt Cloudで、本番環境とのdefer(差分)を取得して新規開発したモデルだけを開発環境でbuildできるようになりました。

早速試してみたので、本記事でその内容をまとめてみます。

試す内容

こちらのアップデートはまだ公式Docのリリースノートにも反映されていないですが、dbtのコミュニティSlackで下図の投稿がありました。

この投稿に併せて、Loomでの動画も投稿されていました。こちらの動画で行っているようなことを、私も試してみました。

事前準備

使用するdbtのバージョンは「1.6」以上に

本機能は使用するdbtのバージョンが1.6以上でないと使用できないため、ご注意ください。

開発環境・本番環境、どちらのEnvironmentでも1.6以上を使用する必要があります。

Defer取得対象のEnvironmentを「Production」に設定

まず、Defer取得対象の本番環境に該当するEnvironmentでSet as Production environmentを押し、対象のEnvironmentをProduction環境であると明示的にします。

有効化されると、Environmentsの一覧で対象のEnvironmentにProductionと表示されるようになります。

IDEでDefer to productionを有効化する

IDE上の右下にDefer to productionがあるため、これを有効化します。

試してみた

前提条件

本番環境にあたるスキーマPRODUCTIONではすべてのModelをBuildしており、開発環境にあたるスキーマDBT_SSAGARAではまだ一つのModelもBuildしていない状態とします。

この状態で、開発環境で新しく開発したModelcustomers_no2.sqlcustomers_no3.sqlをIDE上で各コマンドを用いてBuildしてみます。※この2つのModelはどちらも同じSQLで構成されています。

customers_no2customers_no3stg_customersを親に持つため、今回リリースされた新機能を用いてstg_customersを開発環境でBuildしなくてもcustomers_no2customers_no3をBuildできるのかを確認してみます。

検証その1:シンプルに新しく開発したModelだけをBuildする場合

まずはシンプルに、新しく開発したModelだけをBuildしてみます。

dbt build --select customers_no2を実行してみます。

すると、親モデルであるstg_customersは本番環境のスキーマであるPRODUCTION上のViewを参照して、customers_no2がBuildされました!

検証その2:state:modifiedを入れた場合

続いて、dbt build --select state:modifiedを実行して差分があるModelだけを実行してみます。

すると、本番環境と差分があるcustomers_no2customers_no3だけがBuildされました!親モデルであるstg_customersは本番環境のスキーマであるPRODUCTION上のViewを参照しています。

検証その3:開発環境で親モデルであるstg_customersを一度Buildしている場合

次はちょっと経路を変えて、開発環境で親モデルであるstg_customersを一度Buildしている場合を検証してみます。

この状態で検証その2で実行したdbt build --select state:modifiedを実行すると、本番環境と差分があるcustomers_no2customers_no3だけがBuildされるのですが、参照している親モデルはdbt_ssagaraという開発環境のスキーマになります。target=devの場合にレコード数を絞り込んで開発環境のスキーマでModelをBuildしている場合には、この方が良いケースだと思います。

もし、開発環境のスキーマでBuild済みの親モデルを無視して本番環境のスキーマでBuildされたModelを参照したい場合は、dbt build --select state:modified --favor-stateを実行しましょう。

--favor-stateをつけることで、選択したstateを優先するようになるみたいです。(正直私も詳しいことはわからないのですが、公式Docにそのようなことが書いてあります…)

ということで、dbt build --select state:modified --favor-stateを実行すると、下図のように開発環境のスキーマでBuild済みの親モデルを無視して本番環境のスキーマであるPRODUCTIONでBuildされたModelを参照されます。

最後に

dbt Cloudで、本番環境とのdefer(差分)を取得して新規開発したモデルだけを開発環境でbuildできるようになったのでその機能を試してみました。

開発環境で不要なモデルをBuildせずに開発できるので、DWHのリソースも節約できてとても便利な機能だと思います!ぜひ活用ください。