Контракты моделей
Связанная документация
Зачем определять контракт?
Определение модели dbt так же просто, как написание SQL-запроса select. Ваш запрос естественным образом создает набор данных с именами и типами столбцов на основе выбранных вами столбцов и применяемых трансформаций.
Хотя это идеально подходит для быстрого и итеративного развития, для некоторых моделей постоянное изменение структуры возвращаемого набора данных представляет риск, когда другие люди и процессы запрашивают эту модель. Лучше определить набор предварительных "гарантий", которые определяют структуру вашей модели. Мы называем этот набор гарантий "контрактом". При построении вашей модели dbt проверит, что трансформация вашей модели создаст набор данных, соответствующий ее контракту, или не сможет построить модель.
Где поддерживаются контракты?
Соображения
Есть несколько моментов, которые стоит учитывать при использовании возможностей управления моделями:
-
Такие функции управления моделями, как доступ к моделям (model access), контракты (contracts) и версии (versions), повышают уровень доверия и стабильности в вашем проекте dbt. Однако из‑за добавления дополнительной структуры они могут усложнить откат изменений (например, при необходимости убрать ограничения доступа к модели) и увеличить затраты на сопровождение, если внедрить их слишком рано.
Перед тем как добавлять функции управления, стоит оценить, готов ли ваш проект dbt извлечь из них пользу. Внедрение управления на этапе, когда модели все еще активно меняются, может усложнить будущие изменения. -
Функции управления применяются только к моделям. Они не распространяются на другие типы ресурсов, включая snapshots, seeds или sources. Это связано с тем, что такие объекты могут со временем менять свою структуру (например, snapshots фиксируют изменяющиеся исторические данные) и плохо подходят для предоставления гарантий вроде контрактов, управления доступом или версионирования.
Предварительные требования
Контракты моделей поддерживаются в следующих файлах и моделях, а также на следующих платформах:
- Файл
dbt_project.yml - Файл
properties.yml - SQL-модели
- Модели с одной из следующих материализаций:
tableview— представления поддерживают имена столбцов и типы данных, но неconstraintsincremental— сon_schema_change: append_new_columnsилиon_schema_change: fail
- Некоторые платформы данных, однако поддерживаемые и принудительно применяемые
constraintsразличаются в зависимости от платформы
Контракты моделей НЕ поддерживаются в следующих случаях:
- Python-модели
- SQL-модели с материализацией
materialized viewилиephemeral - Пользовательские материализации (если их автор не добавил поддержку)
- Модели с рекурсивными CTE в BigQuery
- Другие типы ресурсов, такие как
sources,seeds,snapshotsи так далее
Определение контракта
Допустим, у вас есть модель с запросом примерно такого вида:
-- много SQL
final as (
select
customer_id,
customer_name,
-- ... и многое другое ...
from ...
)
select * from final
Чтобы применить контракт модели, установите enforced: true в конфигурации contract.
Когда контракт применяется, он должен включать name и data_type каждого столбца (где data_type соответствует одному из тех, которые понимает ваша платформа данных).
Если ваша модель материализована как table или incremental, и в зависимости от вашей платформы данных, вы можете дополнительно указать constraints, такие как not_null (содержащий нулевые значения).
models:
- name: dim_customers
config:
contract:
enforced: true
columns:
- name: customer_id
data_type: int
constraints:
- type: not_null
- name: customer_name
data_type: string
...
При построении модели с определенным контрактом dbt будет делать две вещи по-другому:
- dbt выполнит проверку "предварительного полета", чтобы убедиться, что запрос модели вернет набор столбцов с именами и типами данных, соответствующими тем, которые вы определили. Эта проверка не зависит от порядка столбцов, указанных в вашей модели (SQL) или спецификации YAML.
- dbt включит имена столбцов, типы данных и ограничения в DDL-запросы, которые он отправляет на платформу данных, которые будут применяться при построении или обновлении таблицы модели, и упорядочит столбцы в соответствии с контрактом, а не вашей моделью dbt.
Поддержка ограничений на платформах
Выберите вкладку нужного адаптера, чтобы узнать больше о поддержке ограничений на разных платформах. Ограничения делятся на три категории в зависимости от возможности их определения и обеспечения их соблюдения платформой:
- Можно определить, соблюдение обеспечивается — Модель не будет построена, если она нарушает ограничение.
- Можно определить, соблюдение не обеспечивается — Платформа позволяет указать тип ограничения, но модель всё равно может быть построена, даже если её построение нарушает это ограничение. Такое ограничение существует только в качестве метаданных. Этот подход более характерен для облачных хранилищ данных, чем для транзакционных баз данных, где чаще обеспечивается строгое соблюдение правил.
- Нельзя определить, соблюдение не обеспечивается — Указать этот тип ограничения для платформы невозможно.
- Redshift
- Snowflake
- BigQuery
- Postgres
- Spark
- Databricks
- Fabric
- Athena
| Тип ограничения | Можно определить | Соблюдение обеспечивается |
|---|---|---|
| not_null | ✅ | ✅ |
| primary_key | ✅ | ❌ |
| foreign_key | ✅ | ❌ |
| unique | ✅ | ❌ |
| check | ❌ | ❌ |
| Тип ограничения | Можно определить | Соблюдение обеспечивается |
|---|---|---|
| not_null | ✅ | ✅ |
| primary_key | ✅ | ❌ |
| foreign_key | ✅ | ❌ |
| unique | ✅ | ❌ |
| check | ❌ | ❌ |
| Тип ограничения | Можно определить | Соблюдение обеспечивается |
|---|---|---|
| not_null | ✅ | ✅ |
| primary_key | ✅ | ❌ |
| foreign_key | ✅ | ❌ |
| unique | ❌ | ❌ |
| check | ❌ | ❌ |
| Тип ограничения | Можно определить | Соблюдение обеспечивается |
|---|---|---|
| not_null | ✅ | ✅ |
| primary_key | ✅ | ✅ |
| foreign_key | ✅ | ✅ |
| unique | ✅ | ✅ |
| check | ✅ | ✅ |
В настоящее время соблюдение ограничений not_null и check обеспечивается только после построения модели. Из-за этого ограничения платформы dbt считает, что эти ограничения можно определить, но их соблюдение не обеспечивается. Это означает, что они не входят в контракт модели, поскольку их соблюдение невозможно обеспечить во время построения. Эта таблица будет меняться по мере развития функциональности.
| Тип ограничения | Можно определить | Соблюдение обеспечивается |
|---|---|---|
| not_null | ✅ | ❌ |
| primary_key | ✅ | ❌ |
| foreign_key | ✅ | ❌ |
| unique | ✅ | ❌ |
| check | ✅ | ❌ |
В настоящее время соблюдение ограничений not_null и check обеспечивается только после построения модели. Из-за этого ограничения платформы dbt считает, что эти ограничения можно определить, но их соблюдение не обеспечивается. Это означает, что они не входят в контракт модели, поскольку их соблюдение невозможно обеспечить во время построения. Эта таблица будет меняться по мере развития функциональности.
| Тип ограничения | Можно определить | Соблюдение обеспечивается |
|---|---|---|
| not_null | ✅ | ✅ |
| primary_key | ✅ | ❌ |
| foreign_key | ✅ | ❌ |
| unique | ❌ | ❌ |
| check | ✅ | ✅ |
Microsoft Fabric сначала создаёт таблицу, а затем добавляет некоторые ограничения отдельными шагами. При построении модели проверяется только not_null. Ограничения первичного ключа, внешнего ключа и уникальности сохраняются в определении таблицы для справки, но Fabric не проверяет их при добавлении новых данных. Определяйте primary_key, foreign_key и unique на уровне модели. Адаптер игнорирует эти типы ограничений на уровне столбцов.
| Тип ограничения | Можно определить | Соблюдение обеспечивается |
|---|---|---|
| not_null | ✅ | ✅ |
| primary_key | ✅ | ❌ |
| foreign_key | ✅ | ❌ |
| unique | ✅ | ❌ |
| check | ❌ | ❌ |
| Тип ограничения | Можно определить | Соблюдение обеспечивается |
|---|---|---|
| not_null | ❌ | ❌ |
| primary_key | ❌ | ❌ |
| foreign_key | ❌ | ❌ |
| unique | ❌ | ❌ |
| check | ❌ | ❌ |