DBT
April 17

dbt. Pre-hooks and Post-hooks (draft)

Pre-hook - это 1 или более sql-выражений, выполняемых до построения ресурса типа модели (или seed, snapshot). Post-hook - то же самое, но выполняемое, соответственно, после построения. Также в хуках могу вызываться макросы, которые выполняют sql-выражения.

Если в хуке выполняется единственный запрос, текст запроса оформляется в кавычки (см пример такого конфига модели ниже)

{{ config
(materialized='table',
alias='emp',
schema='ods_scott',
tags=['ods_layer'],
pre_hook="
insert into scott.model_run_log (log_text, log_dt) 
values ('{{this.schema}}.{{this.table}} start' , now())
"
)
}}

В случае, если в хуке несколько sql-выражений или происходит вызов макроса, всё это оборачивается в квадратные скобки.

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

pre_hook=["truncate table t1;", "truncate table t2;","truncate table t3;"]

Пример вызова макроса в прехуке:

pre_hook = ["{{truncate_table()}}"]

Для реляционных СУБД хуки выполняются в той же транзакции, что и выполнение базового ресурса (модели и тд).

Чтобы изменить такое поведение и реализовать что-то навроде автономных транзакций, можно использовать в блоке конфигурации ресурса вспомогательные макросы before_begin и after_commit.

На рисунке ниже модель не будет собрана, но sql-statement из прехука (запись в таблицу аудита) выполнен будет.

Пример конфигурации с макросами before_begin и after_commit

IRL в прехуке видел только truncate таблицы в инкрементальных моделях. В постхуках мне пока ничего кроме команды analyze не встречалось.

P.S. Напоминаю, что одиночный sql-statement, не возвращающий dataset, также можно выполнить с использованием функции run_query(), например:

{%do run_query ('truncate table scott.model_run_log')%}