Запуск и выбор: 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.