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

Не вкладывайте фигурные скобки

Поэзия

Не вкладывайте фигурные скобки

Если 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')
)
}}

Неправильный пример Этот код не работает в dbt >= v0.15.0. Как только мы обозначили, что находимся внутри выражения 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".... в базе данных. Эти хуки являются особым исключением из вышеуказанного правила.

0