📚

【dbt Docs】Guides - Debugging schema names

2022/03/24に公開

Debugging schema names (スキーマ名のデバッグ)

https://docs.getdbt.com/docs/guides/debugging-schema-names

モデルを構成する際に、予期しないスキーマにビルドされることがある。その際のデバッグをする手順を記載する。

https://www.loom.com/share/1c6e33b504da432dbd07c4cb7f35478e?t=0

Search for a macro named generate_schema_name

macros/ディレクトリに、generate_schama_nameがあるかないかをまず確認する。

I do not have a macro named generate_schema_name in my project(プロジェクトに generate_schama_nameがない場合)

dbtデフォルトのスキーマ名生成ロジックが適用されている。そのスキーマは

{% macro generate_schema_name(custom_schema_name, node) -%}
    {%- set default_schema = target.schema -%}
    {%- if custom_schema_name is none -%}
        {{ default_schema }}
    {%- else -%}
        {{ default_schema }}_{{ custom_schema_name | trim }}
    {%- endif -%}
{%- endmacro %}

このロジックは、2人のdbtユーザーが同じスキーマに書き込むことによって誤って互いの作業を上書きしないように設計されていることに注意してください。

I have a generate_schema_name macro in my project that calls another macro( macros/generate_schema_nameがある場合)

{% macro generate_schema_name(custom_schema_name, node) -%}
    {{ generate_schema_name_for_env(custom_schema_name, node) }}
{%- endmacro %}

とある場合、デフォルトのスキーマ名生成ではなく、generate_schema_name_for_envで上書きをしている。
generate_schema_name_for_envは、dbtグローバルにあるマクロ。target=prodの場合には、<custome_schema_name>になるが、それ以外のtargetの場合は、<default_schema>_<custome_schema_name>になる。

I have a generate_schema_name macro with custom logic

generate_schame_nameを作った人に、どういう意図でつくったのかを尋ねてみる。

Confirm your schema config

models/.sqlファイル内の{{ config() }}を確認する。
もしくは dbt_project.ymlを確認する
どちらの場合も、dbtはこの値をgenerate_schema_nameマクロのcustom_schema_nameパラメータとして渡します。

Confirm your target values

generate_schema_nameマクロのほとんどは、ターゲット変数からのロジックを組み込んでいます。(大体の場合、target.schamaか target.nameを使ってる)

https://docs.getdbt.com/reference/dbt-jinja-functions/target

Put the two together

ロジックを読み直す

Adjust as necessary(必要とあれば修正する)

注意点としては、複数人で開発している場合、複数のモデルで開発している場合に、上書きをしてしまわないか?を確認。上書きをしない場合は <target.shema>_<custome_schema_name>みたいに、連結して予期しない上書きにならないようにする。

Discussion