■ はじめに
dbt で、直接指定する以外で、 DB / Schema / Table を指定する方法を取り上げる。 直接指定するよりも、 ローカル・開発・本番環境などで変更する場合に 役立つこともあるので。
目次
【1】DB / Schema を指定する方法 1)profiles.yml で指定する 2)dbt_project.yml で指定する 3)config で指定する 【2】Table を指定する方法 1)ref関数 【3】変数 var で指定する方法 1)指定方法 2)参照方法 3)サンプル 【4】マクロ で指定する方法
【1】DB / Schema を指定する方法
1)profiles.yml で指定する
https://docs.getdbt.com/docs/core/connect-data-platform/profiles.yml
<profile-name>: target: <target-name> # this is the default target outputs: <target-name>: type: <bigquery | postgres | redshift | snowflake | other> # ★ここ (database/dbname も指定可能) schema: <schema_identifier> threads: <natural_number>
2)dbt_project.yml で指定する
database
https://docs.getdbt.com/reference/resource-configs/database
models: your_project: sales_metrics: +database: reporting
schema
https://docs.getdbt.com/reference/resource-configs/schema
models: your_project: marketing: # Grouping or folder for set of models +schema: marketing
3)config で指定する
{{ config( schema='demo_schema', database='sample_db' ) }}
database
https://docs.getdbt.com/reference/resource-configs/database
-- sample_db というDB名を指定 {{ config((database='sample_db') }}
schema
https://docs.getdbt.com/reference/resource-configs/schema
-- demo_schema というスキーマ名を指定 {{ config(schema='demo_schema') }} --- <target_schema>_<custom_schema> => public_demo_schema
【2】Table を指定する方法
1)ref関数
* 指定されたモデルを データベース.スキーマ.テーブル名を返す
https://docs.getdbt.com/reference/dbt-jinja-functions/ref
より抜粋 ~~~~~~ The most important function in dbt is ref(); dbtで最も重要な関数はref()です。 it's impossible to build even moderately complex models without it. ref()なしでは、適度に複雑なモデルを構築することさえ不可能です。 ref() is how you reference one model within another. ref()は、あるモデルを別のモデルの中で参照する方法です。 ~~~~~~
サンプル
-- {{ ref('依存先モデル名') }} select * from {{ ref("model_name") }} -- {{ ref('依存先モデル名', version=バージョン) }} select * from {{ ref('model_name', version=1) }} -- {{ ref('プロジェクト・パッケージ名', '依存先モデル名') }} select * from {{ ref('project_or_package', 'model_name') }}
【3】変数 var で指定する方法
* DB/Schema/Tableを変数で指定する
https://docs.getdbt.com/reference/dbt-jinja-functions/var
1)指定方法
* 指定方法は、2点。 [1] dbt_project.yml で指定する [2] コマンドラインで指定する
[1] dbt_project.yml で指定する
https://docs.getdbt.com/docs/build/project-variables
name: my_dbt_project version: 1.0.0 config-version: 2 # ★注目★ vars: demo_database: 'test_db' demo_schema: 'test_schema' demo_table: 'test_table' models: ...
[2] コマンドラインで指定する
* dbt run --vars "{ 変数: 値 }" で設定
コマンド例
# dbt run -h より --vars YAML Supply variables to the project. This argument overrides variables defined in your dbt_project.yml file. This argument should be a YAML string, eg. '{demo_table: test_table}'
2)参照方法
-- var で参照(変数を使う) select * from '{{ var("demo_database") }}'.'{{ var("demo_schema") }}'.'{{ var("demo_table") }}' -- {{ var("【変数名】", "【デフォルト値】") }} -- Use 'test_table' as the demo_table if the variable is not defined. select * from '{{ var("demo_table", "test_table") }}'
3)サンプル
/models/hello.sql
{{ config( alias='hello_table', schema='demo_schema', database='sample_db', materialized='table' ) }} SELECT *, now() as insert_at FROM '{{ var("demo_table") }}'
実行
>dbt run --vars "{demo_table: test_table}"
【4】マクロ で指定する方法
* マクロで切り替える
https://docs.getdbt.com/docs/build/custom-databases#generate_database_name
{% macro generate_database_name(custom_database_name=none, node=none) -%} {%- set default_database = target.database -%} {%- if custom_database_name is none -%} {{ default_database }} {%- else -%} {{ custom_database_name | trim }} {%- endif -%} {%- endmacro %}
https://docs.getdbt.com/docs/build/custom-schemas#how-does-dbt-generate-a-models-schema-name
{% macro generate_schema_name(custom_schema_name, node) -%} -- targetは、profiles.yml の中。(https://docs.getdbt.com/reference/dbt-jinja-functions/target) -- target.schema はprofiles.yml で指定されたschema {%- set default_schema = target.schema -%} {%- if custom_schema_name is none -%} {{ default_schema }} {%- elif custom_schema_name is defined and custom_schema_name.startswith('@') -%} {{ custom_schema_name | replace('@', '') | trim }} {%- else -%} -- 【profiles.yml で指定されたschema】_【指定されたSchema名】 {{ default_schema }}_{{ custom_schema_name | trim }} {%- endif -%} {%- endmacro %}
関連記事
dbt ~ 環境設定編 ~
https://dk521123.hatenablog.com/entry/2023/12/16/152147
dbt ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2023/06/30/000000
dbt ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/05/30/151003
dbt ~ Model あれこれ ~
https://dk521123.hatenablog.com/entry/2023/11/26/224522
dbt ~ ドキュメント化 / dbt docs ~
https://dk521123.hatenablog.com/entry/2023/12/10/125512
dbt Macro ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/11/29/003751