sql_header
sql_header не поддерживает Jinja или макросы вроде ref и sourceВ отличие от pre-хуков и post-хуков, макросы вроде ref, source и ссылки вроде {{ this }} не поддерживаются.
Основная функция set_sql_header довольно ограничена. Она предназначена для:
- Создания UDF
- Установки переменных скрипта (BigQuery)
- Установки временных параметров сеанса (Snowflake)
- Models
- Seeds
- Snapshots
{{ config(
sql_header="<sql-statement>"
) }}
select ...
config-version: 2
models:
<resource-path>:
+sql_header: <sql-statement>
Эта конфигурация не реализована для seeds
{% snapshot snapshot_name %}
{{ config(
sql_header="<sql-statement>"
) }}
select ...
{% endsnapshot %}
snapshots:
<resource-path>:
+sql_header: <sql-statement>
Определение
Необязательная конфигурация для вставки SQL выше операторов create table as и create view as, которые dbt выполняет при построении моделей и снимков.
sql_header можно задать с помощью конфигурации или вызовом макроса set_sql_header (пример ниже).
Сравнение с pre-hooks
Pre-hooks также предоставляют возможность выполнить SQL перед созданием модели, как предшествующий запрос. В сравнении, SQL в sql_header выполняется в том же запросе, что и оператор create table|view as.
В результате это делает его более полезным для параметров сессии Snowflake и временных UDF в BigQuery.
Примеры
Установка параметров сессии Snowflake для конкретной модели
Это использует синтаксис блока конфигурации:
{{ config(
sql_header="alter session set timezone = 'Australia/Sydney';"
) }}
select * from {{ ref('other_model') }}
Установка параметров сессии Snowflake для всех моделей
config-version: 2
models:
+sql_header: "alter session set timezone = 'Australia/Sydney';"
Создание временной UDF в BigQuery
Этот пример вызывает макрос set_sql_header. Этот макрос является удобной оберткой, которую вы можете использовать, если у вас есть многострочное SQL-выражение для вставки. В этом случае вам не нужно использовать ключ конфигурации sql_header.
-- Укажите SQL-заголовок:
{% call set_sql_header(config) %}
CREATE TEMPORARY FUNCTION yes_no_to_boolean(answer STRING)
RETURNS BOOLEAN AS (
CASE
WHEN LOWER(answer) = 'yes' THEN True
WHEN LOWER(answer) = 'no' THEN False
ELSE NULL
END
);
{%- endcall %}
-- Укажите код вашей модели:
select yes_no_to_boolean(yes_no) from {{ ref('other_model') }}