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 из прехука (запись в таблицу аудита) выполнен будет.
IRL в прехуке видел только truncate таблицы в инкрементальных моделях. В постхуках мне пока ничего кроме команды analyze не встречалось.
P.S. Напоминаю, что одиночный sql-statement, не возвращающий dataset, также можно выполнить с использованием функции run_query(), например:
{%do run_query ('truncate table scott.model_run_log')%}