[小ネタ]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_DBprod以外の場合: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に応じて参照先のデータベースを切り替える方法について、まとめてみました。
開発環境と本番環境で参照するデータベースを切り替えたいケースはあると思いますので、その際に本記事が参考になると嬉しいです!








