versions
Обратите внимание, что версии моделей отличаются от версий dbt_project.yml и версий файлов свойств .yml.
Версии моделей — это функция, которая позволяет улучшить управление и контроль моделей данных, позволяя отслеживать изменения и обновления моделей с течением времени. Версии dbt_project.yml относятся к совместимости проекта dbt с определенной версией dbt. Номера версий в файлах свойств .yml указывают, как dbt интерпретирует эти YAML файлы. Последние два являются полностью необязательными, начиная с dbt версии 1.5.
version: 2
models:
- name: model_name
versions:
- v: <version_identifier> # обязательно
defined_in: <file_name> # необязательно -- по умолчанию <model_name>_v<v>
columns:
# укажите все столбцы или включите/исключите столбцы из определения модели верхнего уровня в YAML
- include: <include_value>
exclude: <exclude_list>
# укажите дополнительные столбцы
- name: <column_name> # обязательно
- v: ...
# необязательно
latest_version: <version_identifier>
Стандартное соглашение для именования версий моделей — <model_name>_v<v>
. Это касается файла, в котором dbt ожидает найти определение модели (SQL или Python), и псевдонима, который будет использоваться по умолчанию при материализации модели в базе данных.
v
Идентификатор версии для версии модели. Это значение может быть числовым (целым или с плавающей точкой) или любой строкой.
Значение идентификатора версии используется для упорядочивания версий модели относительно друг друга. Если версия модели не явно настраивает latest_version
, то в качестве последней версии используется наибольший номер версии для разрешения вызовов ref
к модели без аргумента version
.
В общем, мы рекомендуем использовать простую схему "основного версионирования" для ваших моделей: 1
, 2
, 3
и так далее, где каждая версия отражает значительное изменение по сравнению с предыдущими версиями. Вы можете использовать и другие схемы версионирования. dbt будет сортировать ваши идентификаторы версий в алфавитном порядке, если значения не все числовые. Вы не должны включать букву v
в идентификатор версии, так как dbt сделает это за вас.
Чтобы запустить модель с несколькими версиями, вы можете использовать --select
флаг. Обратитесь к Версии моделей для получения дополнительной информации и синтаксиса.
defined_in
Имя файла модели (исключая расширение файла, например, .sql
или .py
), в котором определена версия модели.
Если defined_in
не указано, dbt ищет определение версии модели в файле модели с именем <model_name>_v<v>
. Последняя версия модели также может быть определена в файле с именем <model_name>
, без суффикса версии. Имена файлов моделей должны быть уникальными в глобальном масштабе, даже при определении версионных реализаций модели с другим именем.
alias
Псевдоним по умолчанию для версии модели — <model_name>_v<v>
. Логика для этого закодирована в макросе generate_alias_name
.
Этот параметр по умолчанию можно изменить двумя способами:
- Настройка пользовательского
alias
в yaml версии или в определении версии модели - Переопределение макроса
generate_alias_name
dbt, чтобы использовать другое поведение на основеnode.version
См. "Пользовательские псевдонимы" для получения более подробной информации.
Обратите внимание, что значение defined_in
и конфигурация alias
модели не координируются, кроме как по соглашению. Они объявляются и определяются независимо.
Наши рекомендации
- Следуйте согласованному соглашению об именовании версий моделей и псевдонимов.
- Используйте
defined_in
иalias
только если у вас есть ве ские причины. - Создайте представление, которое всегда указывает на последнюю версию вашей модели. Вы можете автоматизировать это для всех версионных моделей в вашем проекте с помощью хука
on-run-end
. Для получения более подробной информации прочитайте полную документацию по "Версии моделей".
Обнаружение значительных изменений
Когда вы используете метод выбора state:modified
в Slim CI, dbt обнаружит изменения в контрактах версионных моделей и выдаст ошибку, если какие-либо из этих изменений могут быть значительными для потребителей ниже по потоку.
К критическим изменениям относятся:
- Удаление существующего столбца
- Изменение типа данных существующего столбца
- Удаление или изменение одного из
constraints
на существующем столбце (dbt версии 1.6 или выше) -
Изменение неконтрактных моделей без версий.
- dbt также предупреждает, если у модели есть или был контракт, но она не имеет версии.
- Пример сообщения для моделей без версий
- Пример сообщения для версионных моделей
Значительное изменение в неконтрактной модели для contracted_model (models/contracted_models/contracted_model.sql)
При сравнении с предыдущим состоянием проекта dbt обнаружил значительное изменение в неконтрактной модели.
- Принудительное соблюдение контракта было удалено: Ранее конфигурация этой модели включала contract: {enforced: true}. Теперь она больше не настроена на соблюдени е своего контракта, и это значительное изменение.
- Столбцы были удалены:
- color
- date_day
- Принудительные ограничения на уровне столбцов были удалены:
- id (ConstraintType.not_null)
- id (ConstraintType.primary_key)
- Принудительные ограничения на уровне модели были удалены:
- ConstraintType.check -> ['id']
- Материализация изменилась с принудительными ограничениями:
- table -> view
Значительное изменение в контракте Ошибка в модели sometable (models/sometable.sql)
При сравнении с предыдущим состоянием проекта dbt обнаружил значительное изменение в принудительном контракте.
Принудительное соблюдение контракта было отключено.
Столбцы были удалены:
- order_name
Столбцы с изменениями типа данных:
- order_id (number -> int)
Рассмотрите возможность внесения добавочного (незначительного) изменения, если это возможно.
В противном случае создайте новую версию модели: https://docs.getdbt.com/docs/collaborate/govern/model-versions
Добавочные изменения не считаются значительными:
- Добавление нового столбца в контрактную модель
- Добавление новых
constraints
к существующему столбцу в контрактной модели