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

Хуки и операции

Связанная документация

Предполагаемые знания

Начало работы с хуками и операциями

Эффективное администрирование баз данных иногда требует выполнения дополнительных SQL-запросов, например:

  • Создание UDF
  • Управление разрешениями на уровне строк или столбцов
  • Очистка таблиц в Redshift
  • Создание разделов в внешних таблицах Redshift Spectrum
  • Возобновление/приостановка/изменение размера складов в Snowflake
  • Обновление pipe в Snowflake
  • Создание общего доступа в Snowflake
  • Клонирование базы данных в Snowflake

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

О хуках

Хуки — это фрагменты SQL, которые выполняются в разное время:

  • pre-hook: выполняется перед построением модели, seed или snapshot.
  • post-hook: выполняется после построения модели, seed или snapshot.
  • on-run-start: выполняется в начале

    dbt build, dbt compile, dbt docs generate, dbt run, dbt seed, dbt snapshot или dbt test.

  • on-run-end: выполняется в конце

    dbt build, dbt compile, dbt docs generate, dbt run, dbt seed, dbt snapshot или dbt test.

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

Если (и только если) вы не можете использовать grants resource-config, вы можете использовать post-hook для выполнения более сложных рабочих процессов:

  • Необходимо применить grants более сложным способом, который конфигурация grants в dbt Core пока не поддерживает.
  • Необходимо выполнить пост-обработку, которую dbt не поддерживает из коробки. Например, analyze table, alter table set property, alter table ... add row access policy и т.д.

Примеры использования хуков

Вы можете использовать хуки для запуска действий в определенные моменты при выполнении операции или построении модели, seed или snapshot.

Для получения дополнительной информации о том, когда могут быть вызваны хуки, см. разделы справки для on-run-start и on-run-end хуков и pre-hook и post-hook.

Вы можете использовать хуки для предоставления специфичной для базы данных функциональности, недоступной из коробки в dbt. Например, вы можете использовать блок config для выполнения оператора ALTER TABLE сразу после построения отдельной модели с помощью post-hook:

models/<model_name>.sql
{{ config(
post_hook=[
"alter table {{ this }} ..."
]
) }}

Вызов макроса в хуке

Вы также можете использовать макрос для объединения логики хука. Ознакомьтесь с некоторыми примерами в разделах справки для on-run-start и on-run-end хуков и pre- и post-хуков.

models/<model_name>.sql
{{ config(
pre_hook=[
"{{ some_macro() }}"
]
) }}
models/properties.yml
models:
- name: <model_name>
config:
pre_hook:
- "{{ some_macro() }}"
dbt_project.yml
models:
<project_name>:
+pre-hook:
- "{{ some_macro() }}"

Операции

Операции — это макросы, которые вы можете выполнять с помощью команды run-operation. Таким образом, операции на самом деле не являются отдельным ресурсом в вашем проекте dbt — это просто удобный способ вызвать макрос без необходимости выполнения модели.

Явное выполнение SQL в операции

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

Этот макрос выполняет аналогичное действие, как и вышеупомянутые хуки:

macros/grant_select.sql
{% macro grant_select(role) %}
{% set sql %}
grant usage on schema {{ target.schema }} to role {{ role }};
grant select on all tables in schema {{ target.schema }} to role {{ role }};
grant select on all views in schema {{ target.schema }} to role {{ role }};
{% endset %}

{% do run_query(sql) %}
{% do log("Privileges granted", info=True) %}
{% endmacro %}

Чтобы вызвать этот макрос как операцию, выполните dbt run-operation grant_select --args '{role: reporter}'.

$ dbt run-operation grant_select --args '{role: reporter}'
Running with dbt=0.16.1
Privileges granted

Полная документация по использованию команды run-operation доступна здесь.

Дополнительные примеры

Эти примеры из сообщества подчеркивают некоторые случаи использования хуков и операций!

0