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

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

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, удалите конфигурацию target_schema из ваших снэпшотов. Если вам всё же нужна собственная схема для снэпшотов, используйте вместо этого параметр schema.

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

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

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

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

    Нашли ошибку?

    0