dbt の incremental モデルを試す
こんにちは、 @kz_morita です。
普段開発で dbt を用いて開発をしていますが、共通のDBにデータを入れるが、dbt の実行は別のタイミングで動かしたいという要件がありました。わかりやすい例で言うとマルチテナントのデータでテナントごとにデータの更新を行いたい場合などです。 このときに、dbt の incremental モデルを使うと、テナントごとにデータの更新を行うことができそうだったので調査しました。
このあとでは、データごとに client_id というテナントを管理する ID を持つデータを仮定し、dbt の incremental モデルを使って client_id ごとにデータの更新を行う方法について説明します。
結論 incremental model で unique_key を client_id, incremental_storategy を delete+insert にすれば、client_id ごとのモデルの実行ができた
ただし、データモデルに以下の変更をする必要がある
materialized = incremetal
config( materialized='incremental', unique_key='client_id', incremental_strategy='delete+insert', ) is_incremental による client_id のフィルタをつける
{% if is_incremental() %} where client_id = {{ var('client_id') }} {% endif %} dbt build 時などに client_id を変数として渡すこと対象のデータのみを更新できる