[小ネタ]「Fivetranのdbt Transformationで設定したスキーマとデータベース」と「dbtのyamlで定義したスキーマとデータベース」どちらが優先されるかを確かめてみた

2023.11.07

さがらです。

小ネタですが、「Fivetranのdbt Transformationで設定したスキーマとデータベース」と「dbtのyamlで定義したスキーマとデータベース」どちらが優先されるかを確かめてみたので、その内容をまとめてみます。

前置き

Fivetranのdbt Transformationでは、設定を行う際に出力先のスキーマとデータベースを定義することができます。

また、dbtのyamlでも出力先のスキーマとデータベースを設定できます。

そこでふと、「この設定とFivetran上での設定、どちらが優先されるのか?」が気になったので試してみました。

前提条件

  • dbtのバージョン:1.6.6 ※Fivetran上での設定
  • generate_schema_namegenerate_database_nameのマクロは、デフォルトから変更なし

結論:「dbtのyamlで定義したスキーマとデータベース」が優先される

ということで早速結論なのですが、「dbtのyamlで定義したスキーマとデータベース」が優先されます。

これは推測なのですが、Fivetranのdbt Transformationの設定に基づいて、裏側でdbt Coreに必須のprofile.ymlが作られるという挙動をしていそうですね。そのため、dbtのyamlでの設定した出力先が優先される、と解釈しています。

以下、やってみたことをまとめます。

検証内容

Fivetranのdbt Transformationと紐づけているリポジトリ上で、dbt_project.ymlを下記のようにします。

# yamlファイル全体から、変更箇所のみ抜粋

models:
  jaffle_shop:
    +database: sagara_dbt_test_db
    +schema: prod_from_dbtyaml
    staging:
      materialized: view
    mart: 
      materialized: table

こうすると、以下のように出力先のデータベースとスキーマの設定が競合しているという状況になります。

  • Fivetranのdbt Transformationの設定
    • データベース:sagara_dbt_demo_db
    • スキーマ:production
  • dbt_project.ymlの設定
    • データベース:sagara_dbt_test_db
    • スキーマ:prod_from_dbtyaml

この状態で、このリポジトリと紐づいたdbt Transformationの処理をFivetranから実行してみます。

すると、dbt_project.ymlで設定したデータベースとスキーマに併せて出力がされました!(スキーマ名については、get_custom_schema.sqlのデフォルトの挙動に沿っているためこれで正しいです。)

最後に

簡単ではありましたが、「Fivetranのdbt Transformationで設定したスキーマとデータベース」と「dbtのyamlで定義したスキーマとデータベース」では、「dbtのyamlで定義したスキーマとデータベース」で定義した内容が優先されるということがわかりました!