![[小ネタ]dbtのsourceでtarget.nameに応じて参照先のデータベースを切り替える方法](https://images.ctfassets.net/ct0aopd36mqt/wp-thumbnail-f846b6052d1f7b983172226c6b1ed44b/6b4729aabfb5b7a3359acc27dc6b5453/dbt-1200x630-1.jpg)
[小ネタ]dbtのsourceでtarget.nameに応じて参照先のデータベースを切り替える方法
さがらです。
小ネタですが、dbtのsourceでtarget.name
に応じて参照先のデータベースを切り替える方法について、本記事でまとめます。
方法
結論から入りますが、以下のようにdatabase:
で、{% if target.name == 'prod' %}
のようにJinjaで条件分岐してあげればOKです。
version: 2
sources:
- name: jaffle_shop
database: "{% if target.name == 'prod' %}SAGARA_RAWDATA_DB{% else %}SAGARA_RAWDATA_DB_CLONE{% endif %}"
tables:
- name: customers
columns:
- name: id
data_tests:
- unique
- not_null
試してみた
dbt Cloudで、この記述を行った時にどのように挙動するかを見てみます。
事前準備
dbt CloudのIDEのtargetを指定するDevelopment Credentialではdev、dbt CloudのJobのtargetではprod、と定義しておきます。
dbt Cloudでのtargetの定義方法については、下記の記事が参考になると思います。
sourceの定義
冒頭の内容と同じですが、以下のようにsourceを定義します。
database:
で条件分岐を行っているため、以下のようにtargetごとに異なるデータベースを参照するようになります。
prod
の場合:SAGARA_RAWDATA_DB
prod
以外の場合:SAGARA_RAWDATA_DB_CLONE
version: 2
sources:
- name: jaffle_shop
database: "{% if target.name == 'prod' %}SAGARA_RAWDATA_DB{% else %}SAGARA_RAWDATA_DB_CLONE{% endif %}"
tables:
- name: customers
columns:
- name: id
data_tests:
- unique
- not_null
Studio(target.nameがdev)で実行
IDEであるStudioで、dbt build
を実行します。
sourceを参照するViewの定義を見ると、SAGARA_RAWDATA_DB_CLONE
を参照していることがわかります。
Job(target.nameがprod)で実行
target
をprod
に設定したJobでdbt build
を実行コマンドとして定義して、Jobを実行してみます。
sourceを参照するViewの定義を見ると、SAGARA_RAWDATA_DB
を参照していることがわかります。ちゃんとtarget
の値に応じて参照先のデータベースが切り替わっていますね!
最後に
dbtのsourceでtarget.name
に応じて参照先のデータベースを切り替える方法について、まとめてみました。
開発環境と本番環境で参照するデータベースを切り替えたいケースはあると思いますので、その際に本記事が参考になると嬉しいです!