Запуск и выбор: run, test, build, --select

Не всегда нужно строить весь проект — dbt умеет точечно выбирать, что запускать.

--select — флаг, задающий подмножество узлов графа для запуска; вместе с командами run, test и build он даёт точный контроль над тем, что и в каком объёме строится.

Три ключевые команды

КомандаЧто делает
dbt runСтроит модели (выполняет SELECT'ы)
dbt testПрогоняет тесты данных
dbt buildСтроит и тестирует в правильном порядке: run + test + seed + snapshot

dbt build — самая «правильная» команда для прода: она не просто строит модель, а сразу тестирует её и только при успехе идёт дальше по графу. Если тест модели упал — зависимые от неё модели не строятся на испорченных данных.

Графовые операторы --select

Сила --select — в операторах графа. Знак + означает «и всё, что выше/ниже по зависимостям»:

# Только сама модель
dbt run --select fct_orders

# Модель и всё, что от неё зависит (downstream)
dbt run --select fct_orders+

# Модель и всё, от чего она зависит (upstream)
dbt run --select +fct_orders

# Вся цепочка вокруг модели
dbt run --select +fct_orders+

# Всё в папке staging
dbt run --select staging

# По тегу
dbt run --select tag:daily
modelсама модель
model+модель и потомки (что сломается при правке)
+modelмодель и предки (что нужно построить раньше)
+model+вся связанная цепочка

Запуск только изменённого: state

В больших проектах перестраивать всё дорого. dbt умеет запускать только то, что изменилось относительно прошлого состояния (manifest.json предыдущего прогона):

# Построить только изменённые модели и их потомков
dbt build --select state:modified+ --state ./prod_manifest

Это основа «slim CI» — проверять в pull request лишь то, что реально затронуто (подробнее в следующем разделе).

Как работает под капотом

--select работает поверх DAG: dbt парсит выражение, находит указанные узлы и расширяет выборку операторами (+, tag:, path:, state:), получая итоговый набор узлов. Затем выполняет команду только над ними, соблюдая порядок зависимостей внутри подграфа. state:modified сравнивает текущий manifest с эталонным и вычисляет, какие узлы изменились, — так dbt узнаёт, что трогать.

Частые ошибки

  • Использовать run вместо build на проде. run строит, но не тестирует — испорченные данные поедут дальше.
  • Путать +model и model+. Префикс — предки (upstream), суффикс — потомки (downstream).
  • Перестраивать всё каждый раз. В больших проектах используйте state:modified+.

Итоги

  • run строит, test проверяет, build делает run+test+seed+snapshot по графу — это команда для прода.
  • --select с операторами + выбирает модель и её предков/потомков.
  • state:modified+ запускает только изменённое — основа быстрого CI.
Проверьте себя
1. Чем dbt build отличается от dbt run?
AНичем
Bbuild строит И тестирует (а также seed/snapshot) в порядке графа, run только строит
Cbuild быстрее
Drun тестирует, build нет
2. Что выберет --select +fct_orders?
AТолько саму модель fct_orders
Bfct_orders и все модели, от которых она зависит (предки/upstream)
Cfct_orders и всё, что от неё зависит (потомки)
DВсе модели проекта
3. Что делает выборка state:modified+?
AСтроит весь проект
BЗапускает только изменённые модели и их потомков относительно эталонного состояния
CУдаляет старые модели
DТестирует подключение