[小ネタ]dbtでtarget.nameに応じてgeneric testの実行有無を切り替える方法
さがらです。
dbtでtarget.name
に応じてgeneric testの実行有無を切り替える方法について、本記事でまとめます。
※実行有無についてはtagで切り替えることもできますが、dbtコマンドの実行時にtagの指定が必要だったり、tag自体の管理も煩雑になりやすいため、今回target.name
で切り替える方法を考えてみました。
方法
結論から入りますが、下記のようにconfig:
でenabled: "{{ target.name == 'prod' }}"
やenabled: "{{ target.name in ['prod', 'staging'] }}"
のように記述すればOKです。
version: 2
models:
- name: your_model
columns:
- name: id
data_tests:
- unique:
config:
enabled: "{{ target.name == 'prod' }}"
- not_null:
config:
enabled: "{{ target.name in ['prod', 'staging'] }}"
ロジックとしては、enabled:
という対象のリソースを有効にするか無効にするかを定義するconfigがあるため、これに対してJinjaでtarget.name
の値を用いたtrue/falseの判断をしているだけです。
試してみた
dbt Cloudで、この記述を行った時にどのように挙動するかを見てみます。
dbt Cloudでのtargetの定義方法については、下記の記事が参考になると思います。
targetの定義
dbt CloudのIDEのtargetを指定するDevelopment Credentialではdev
、dbt CloudのJobのtargetではprod
、と定義しておきます。
- Development Credentialのtarget
- Jobのtarget
yamlの定義
下記のように定義します。stg_orders
に対するaccepted_values
のテストが、target.name
がprod
またはstaging
のときのみ動くような設定にしています。
version: 2
models:
- name: customers
description: 顧客情報をまとめたテーブル
columns:
- name: customer_id
description: Primary key
data_tests:
- unique
- not_null
- name: first_order_date
description: 顧客がまだ注文していない場合はNULL。(NULL when a customer has not yet placed an order)
- name: stg_customers
description: 元のcustomerテーブルを整えたテーブル。(This model cleans up customer data)
columns:
- name: customer_id
description: Primary key
data_tests:
- unique
- not_null
- name: stg_orders
description: 元のordetsテーブルを整えたテーブル。(This model cleans up order data)
columns:
- name: order_id
description: Primary key
data_tests:
- unique
- not_null
- name: status
data_tests:
- accepted_values:
values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']
config:
enabled: "{{ target.name in ['prod', 'staging'] }}"
IDE(target.nameがdev)で実行
IDEでdbt build
を実行します。
stg_orders
に対するaccepted_values
のテストが行われていないことがわかります。
Job(target.nameがprod)で実行
targetをprod
にしたJobで、dbt build
を実行コマンドとして定義して、Jobを実行してみます。
stg_orders
に対するaccepted_values
のテストが行われていることがわかります。
最後に
dbtでtarget.name
に応じてgeneric testの実行有無を切り替える方法についてまとめてみました。
dev・staging・prodといった各実行環境でdbt testの実行有無を切り替えたいケースはあると思いますので、その際に参考になると嬉しいです!