Не вкладывайте фигурные скобки
Поэзия
Не вкладывайте фигурные скобки
Если dbt выдает ошибку рано
и ваш Jinja делает вас угрюмым
не пишите в Slack
просто сделайте шаг назад
и проверьте, не вкладываете ли вы свои фигурные скобки.
Jinja
При написании Jinja-кода в проекте dbt может возникнуть соблазн вкладывать выражения друг в друга. Рассмотрим следующий пример:
{{ dbt_utils.date_spine(
datepart="day",
start_date=[ ИСПОЛЬЗУЙТЕ JINJA ЗДЕСЬ ]
)
}}
Чтобы вложить одно Jinja-выражение внутрь другого Jinja-выражения, просто поместите нужный код (без фигурных скобок) непосредственно внутрь выражения.
Правильный пример
Здесь возвращаемое значение метода контекста var() передается в качестве аргумента start_date макросу date_spine. Отлично!
{{ dbt_utils.date_spine(
datepart="day",
start_date=var('start_date')
)
}}
Неправильный пример
После того как мы обозначили, что находимся внутри выражения Jinja (используя синтаксис {{), внутри самого выражения Jinja больше не требуется использовать фигурные скобки. Этот код передаст буквальное строковое значение "{{ var('start_date') }}" в качестве аргумента start_date для макроса date_spine. Скорее всего, это не то, что вы на самом деле хотите сделать!
-- Не делайте так! Это не сработает!
{{ dbt_utils.date_spine(
datepart="day",
start_date="{{ var('start_date') }}"
)
}}
Вот еще один пример:
{# Любой из этих вариантов работает #}
{% set query_sql = 'select * from ' ~ ref('my_model') %}
{% set query_sql %}
select * from {{ ref('my_model') }}
{% endset %}
{# Этот не работает #}
{% set query_sql = "select * from {{ ref('my_model')}}" %}
Исключение
Есть одно исключение из этого правила: вложенные фигурные скобки допустимы в хуках (например, on-run-start, on-run-end, pre-hook и post-hook).
Код, подобный этому, является как допустимым, так и рекомендуемым:
{{ config(post_hook="grant select on {{ this }} to role bi_role") }}
Почему же в этом случае разрешены вложенные фигурные скобки? Здесь мы действительно хотим, чтобы строковый литерал "grant select on {{ this }} ..." был сохранен в качестве значения конфигурации для post-hook в этой модели. Эта строка будет повторно отрендерена при запуске модели, что приведет к выполнению осмысленного SQL-выражения, такого как grant select on "schema"."table".... в базе данных. Эти хуки являются особым исключением из вышеуказанного правила.