Предостережения при сравнении состояний
Метод выбора state:
— это мощная функция с множеством сложностей. Ниже приведены некоторые соображения при настройке автоматизированных задач, использующих сравнение состояний.
Seeds
dbt сохраняет хэш-файл seed-файлов размером менее 1 МиБ. Если содержимое этих seed-файлов изменено, seed будет включен в state:modified
.
Если seed-файл больше 1 МиБ, dbt не может сравнить его содержимое и выдаст предупреждение. Вместо этого dbt будет использовать только путь к файлу seed для обнаружения изменений. Если путь к файлу изменился, seed будет включен в state:modified
; если нет, то не будет.
Макросы
dbt пометит как измененные все ресурсы, которые зависят от измененного макроса или от макроса, который зависит от измененного макроса.
Переменные
Если модель использует var
или env_var
в своем определении, dbt в настоящее время не может определить эту зависимость таким образом, чтобы включить модель в state:modified
, если значение var
или env_var
изменилось. Вероятно, модель будет помечена как измененная, если изменение переменной приведет к другой конфигурации.
Тесты
Команда dbt test -s state:modified
будет включать как:
- тесты, которые выбирают из нового/измененного ресурса
- тесты, которые сами по себе новые или измененные
Пока вы добавляете или изменяете тесты одновременно с добавлением или изменением ресурсов (моделей, seed-файлов, снимков), из которых они выбирают, все должно работать так, как вы ожидаете, с "простым" выбором состояния:
dbt run -s "state:modified"
dbt test -s "state:modified"
Однако это может усложниться. Если вы добавите новый тест без изменения его базовой модели или добавите тест, который выбирает из новой модели и старой неизмененной, вам может понадобиться протестировать модель, не запустив ее сначала.
Вы можете отложить ссылки на вышестоящие элементы при тестировании. Например, если тест выбирает из модели, которая не существует как объект базы данных в вашей текущей среде, dbt обратится к другой среде — той, которая определена в вашем манифесте состояния. Это позволяет использовать "простой" выбор состояния без риска сбоя запроса, но может иметь неожиданные последствия для тестов с несколькими родителями. Например, если у вас есть тест relationships
, который зависит от одной измененной модели и одной неизмененной, запрос теста будет выбирать данные "между" двумя разными средами. Если вы ограничиваете или выбираете данные в разработке и CI, может не иметь смысла проверять целостность ссылок, зная, что есть большая вероятность несоответствия.
Если вы часто используете тесты relationships
или тесты данных, или часто добавляете тесты без изменения их базовых моделей, рассмотрите возможность настройки критериев выбора для вашей CI-задачи. Например:
dbt run -s "state:modified"
dbt test -s "state:modified" --exclude "test_name:relationships"
Ложные срабатывания
Заключительное замечание
Сравнение состояний — это сложный процесс. Мы надеемся достичь конечной согласованности между всеми вариантами конфигурации, а также предоставить польз ователям контроль, необходимый для надежного возврата всех измененных ресурсов и только тех, которые они ожидают. Если вы хотите узнать больше, прочитайте открытые вопросы с тегом "state" в репозитории dbt.