![[新機能]dbt Cloudで本番環境とのdefer(差分)を取得して新規開発したモデルだけを開発環境でbuildできるようになりました](https://devio2023-media.developers.io/wp-content/uploads/2022/03/dbt-1200x630-1.jpg)
[新機能]dbt Cloudで本番環境とのdefer(差分)を取得して新規開発したモデルだけを開発環境でbuildできるようになりました
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
さがらです。
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.sqlとcustomers_no3.sqlをIDE上で各コマンドを用いてBuildしてみます。※この2つのModelはどちらも同じSQLで構成されています。
customers_no2とcustomers_no3はstg_customersを親に持つため、今回リリースされた新機能を用いてstg_customersを開発環境でBuildしなくてもcustomers_no2とcustomers_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_no2とcustomers_no3だけがBuildされました!親モデルであるstg_customersは本番環境のスキーマであるPRODUCTION上のViewを参照しています。
検証その3:開発環境で親モデルであるstg_customersを一度Buildしている場合
次はちょっと経路を変えて、開発環境で親モデルであるstg_customersを一度Buildしている場合を検証してみます。
この状態で検証その2で実行したdbt build --select state:modifiedを実行すると、本番環境と差分があるcustomers_no2とcustomers_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のリソースも節約できてとても便利な機能だと思います!ぜひ活用ください。



















