[小ネタ]dbtのsourceでtarget.nameに応じて参照先のデータベースを切り替える方法

[小ネタ]dbtのsourceでtarget.nameに応じて参照先のデータベースを切り替える方法

Clock Icon2025.06.16

さがらです。

小ネタですが、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の定義方法については、下記の記事が参考になると思います。

https://dev.classmethod.jp/articles/dbt-cloud-how-to-change-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を参照していることがわかります。

2025-06-16_16h38_32

Job(target.nameがprod)で実行

targetprodに設定したJobでdbt buildを実行コマンドとして定義して、Jobを実行してみます。

sourceを参照するViewの定義を見ると、SAGARA_RAWDATA_DBを参照していることがわかります。ちゃんとtargetの値に応じて参照先のデータベースが切り替わっていますね!

2025-06-16_16h43_52

最後に

dbtのsourceでtarget.nameに応じて参照先のデータベースを切り替える方法について、まとめてみました。

開発環境と本番環境で参照するデータベースを切り替えたいケースはあると思いますので、その際に本記事が参考になると嬉しいです!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.