【dbt】dbt ~ DB/Schema/Table の指定方法 ~

■ はじめに

 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