Перейти к основному содержимому
💡Полезно знать
Доступно начиная с dbt v1.12 или в канале релизов v1 Latest.

on_error

dbt_project.yml
models:
<resource-path>:
+on_error: skip_children | continue

Определение​

Конфигурация on_error определяет, что происходит с нижестоящими (дочерними) моделями, если во время запуска модель завершается с ошибкой. Эта конфигурация применяется только к моделям и не влияет на тесты. Чтобы управлять выполнением нижестоящих моделей после сбоя теста, используйте конфигурацию severity для тестов.

on_error принимает два значения:

  • skip_children (по умолчанию): все нижестоящие модели пропускаются, если модель завершается с ошибкой.
  • continue: нижестоящие модели продолжают выполняться, если модель завершается с ошибкой, а не пропускаются.

Пример​

Задайте on_error: continue, если нижестоящие модели могут корректно выполняться даже при сбое вышестоящей модели (например, если в них предусмотрена резервная логика или используются независимые источники данных).

models/my_model.sql
{{ config(
materialized='table',
on_error='continue'
) }}

select 1 as id

Если для модели, завершившейся с ошибкой, задано on_error: continue, dbt выполняет нижестоящие модели, а не пропускает их. Модель, завершившаяся с ошибкой, по-прежнему отмечается как ошибочная в результатах запуска, а сам запуск считается неудачным, даже если все нижестоящие модели выполнены успешно.

Флаг --fail-fast имеет приоритет над on_error: continue. Если задан --fail-fast, dbt останавливается при первом сбое и пропускает все оставшиеся модели независимо от их конфигурации on_error.

Поведение при наличии нескольких вышестоящих моделей​

Если у модели несколько вышестоящих моделей, skip_children имеет приоритет над continue. Если хотя бы одна из вышестоящих моделей, завершившихся с ошибкой, использует skip_children, нижестоящая модель пропускается — даже если другие вышестоящие модели, завершившиеся с ошибкой, используют continue.

Например, рассмотрим DAG, в котором model_c зависит и от model_a, и от model_b:

  • model_a использует on_error: skip_children
  • model_b использует on_error: continue

В следующей таблице показано поведение model_c в зависимости от результатов выполнения вышестоящих моделей:

Результат model_a (skip_children)Результат model_b (continue)Поведение model_c
УспешноУспешноВыполняется
ОшибкаУспешноПропускается
УспешноОшибкаВыполняется
ОшибкаОшибкаПропускается

Если model_a завершается с ошибкой, model_c всегда пропускается, поскольку model_a использует skip_children. Если с ошибкой завершается только model_b, model_c всё равно выполняется, поскольку model_b использует continue, что не блокирует выполнение нижестоящих моделей.

Нашли ошибку?

0
Loading