Перейти к основному содержимому

Отладка имен схем

Обновлен
dbt Core
Troubleshooting
Advanced
Menu

    Введение

    Если модель использует конфигурацию schema, но создается в неожиданной схеме, вот несколько шагов для отладки этой проблемы. Полное объяснение пользовательских схем можно найти здесь.

    Вы также можете следовать за видео:

    Поиск макроса с именем generate_schema_name

    Выполните поиск файлов, чтобы проверить, есть ли у вас макрос с именем generate_schema_name в каталоге macros вашего проекта.

    У вас нет макроса с именем generate_schema_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 %}

    Обратите внимание, что эта логика разработана так, чтобы два пользователя dbt случайно не перезаписали работу друг друга, записывая в одну и ту же схему.

    У вас есть макрос generate_schema_name в проекте, который вызывает другой макрос

    Если ваш макрос generate_schema_name выглядит следующим образом:

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

    Ваш проект заменяет макрос generate_schema_name на другой макрос, generate_schema_name_for_env. Подобно приведенному выше примеру, это макрос, который определен в глобальном проекте dbt, здесь.

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

    {%- set default_schema = target.schema -%}
    {%- if target.name == 'prod' and custom_schema_name is not none -%}

    {{ custom_schema_name | trim }}

    {%- else -%}

    {{ default_schema }}

    {%- endif -%}

    {%- endmacro %}

    У вас есть макрос generate_schema_name с пользовательской логикой

    Если это так — возможно, стоит обратиться к человеку, который добавил этот макрос в ваш проект, так как у него будет контекст — вы можете использовать функцию blame на GitHub для этого.

    Во всех случаях уделите время, чтобы прочитать Jinja и попытаться следовать логике.

    Подтвердите вашу конфигурацию schema

    Проверьте, используете ли вы конфигурацию schema в вашей модели, либо через блок {{ config() }}, либо из dbt_project.yml. В обоих случаях dbt передает это значение как параметр custom_schema_name макроса generate_schema_name.

    Подтвердите ваши значения target

    Большинство макросов generate_schema_name включают логику из переменной target, в частности target.schema и target.name. Используйте документацию здесь, чтобы помочь вам найти значения каждого ключа в этом словаре.

    Объедините все вместе

    Теперь перечитайте логику вашего макроса generate_schema_name и мысленно подставьте ваши значения customer_schema_name и target.

    Вы должны обнаружить, что схема, которую dbt создает для вашей модели, соответствует выходным данным вашего макроса generate_schema_name.

    Будьте осторожны. Снимки не следуют этому поведению, если установлен target_schema. Чтобы иметь снимки, зависящие от окружения, в версии v1.9+ или dbt Cloud, удалите конфигурацию target_schema из ваших снимков. Если вы все еще хотите пользовательскую схему для ваших снимков, используйте вместо этого конфигурацию schema.

    Настройте по мере необходимости

    Теперь, когда вы понимаете, как генерируется схема модели, вы можете настроить ее по мере необходимости:

    • Вы можете настроить логику в вашем макросе generate_schema_name (или добавить этот макрос в ваш проект, если у вас его еще нет, и настроить оттуда)
    • Вы также можете настроить детали вашего target (например, изменить имя цели)

    Если вы измените логику в generate_schema_name, важно учитывать, не будут ли два пользователя записывать в одну и ту же схему при разработке моделей dbt. Это соображение является причиной, по которой реализация макроса по умолчанию объединяет вашу целевую схему и пользовательскую схему вместе — мы обещаем, что пытались быть полезными, реализуя это поведение, но признаем, что полученное имя схемы неинтуитивно.

    0