Перейти к основному содержимому

constraints

Ограничения — это функция многих платформ данных. Когда они указаны, платформа выполняет дополнительную проверку данных при их добавлении в новую таблицу или вставке в уже существующую таблицу. Если проверка не проходит, создание или обновление таблицы не удается, операция откатывается, и вы увидите четкое сообщение об ошибке.

Когда ограничения применяются, они гарантируют, что вы никогда не увидите недопустимые данные в таблице, материализованной вашей моделью. Применение варьируется в зависимости от платформы данных.

Ограничения требуют объявления и применения контракта модели contract.

Ограничения никогда не применяются к моделям ephemeral или тем, которые материализуются как view. Только модели table и incremental поддерживают применение и соблюдение ограничений.

Определение ограничений

Ограничения могут быть определены для одного столбца или на уровне модели для одного или нескольких столбцов. Как общее правило, мы рекомендуем определять ограничения для одного столбца непосредственно на этих столбцах.

Если вы определяете несколько ограничений primary_key для одной модели, они должны быть определены на уровне модели. Определение нескольких ограничений primary_key на уровне столбца не поддерживается.

Структура ограничения:

  • type (обязательно): одно из not_null, unique, primary_key, foreign_key, check, custom
  • expression: Свободный текст для уточнения ограничения. Обязательно для некоторых типов ограничений и необязательно для других.
  • name (необязательно): Удобочитаемое имя для этого ограничения. Поддерживается некоторыми платформами данных.
  • columns (только на уровне модели): Список имен столбцов, к которым применяется ограничение.

Поддержка, специфичная для платформы

В транзакционных базах данных возможно определение "ограничений" на допустимые значения определенных столбцов, более строгих, чем просто тип данных этих значений. Например, Postgres поддерживает и применяет все ограничения стандарта ANSI SQL (not null, unique, primary key, foreign key), а также гибкое ограничение на уровне строки check, которое оценивается в логическое выражение.

Большинство аналитических платформ данных поддерживают и применяют ограничение not null, но они либо не поддерживают, либо не применяют остальные. Иногда все же желательно добавить "информационное" ограничение, зная, что оно не применяется, для интеграции с устаревшими инструментами каталогов данных или диаграмм сущность-связь (dbt-core#3295). Некоторые платформы данных могут опционально использовать ограничения первичного или внешнего ключа для оптимизации запросов, если вы укажете дополнительное ключевое слово.

Для этого вы можете указать два дополнительных поля для любого фильтра:

  • warn_unenforced: False, чтобы пропустить предупреждение об ограничениях, которые поддерживаются, но не применяются этой платформой данных. Ограничение будет включено в шаблонный DDL.
  • warn_unsupported: False, чтобы пропустить предупреждение об ограничениях, которые не поддерживаются этой платформой данных, и поэтому не будут включены в шаблонный DDL.
  • Документация по ограничениям PostgreSQL: здесь
models/constraints_example.sql
{{
config(
materialized = "table"
)
}}

select
1 as id,
'My Favorite Customer' as customer_name,
cast('2019-01-01' as date) as first_transaction_date
models/schema.yml
models:
- name: dim_customers
config:
contract:
enforced: true
columns:
- name: id
data_type: int
constraints:
- type: not_null
- type: primary_key
- type: check
expression: "id > 0"
- name: customer_name
data_type: text
- name: first_transaction_date
data_type: date

Ожидаемый DDL для применения ограничений:

target/run/.../constraints_example.sql
create table "database_name"."schema_name"."constraints_example__dbt_tmp"
(
id integer not null primary key check (id > 0),
customer_name text,
first_transaction_date date
)
;
insert into "database_name"."schema_name"."constraints_example__dbt_tmp"
(
id,
customer_name,
first_transaction_date
)
(
select
1 as id,
'My Favorite Customer' as customer_name,
cast('2019-01-01' as date) as first_transaction_date
);

Пользовательские ограничения

В dbt Cloud и dbt Core вы можете использовать пользовательские ограничения на моделях для расширенной конфигурации таблиц. Разные хранилища данных поддерживают разные синтаксисы и возможности.

Пользовательские ограничения позволяют добавлять конфигурацию к конкретным столбцам. Например:

  • Установить политику маскирования в Snowflake при использовании Create Table As Select (CTAS).

  • Другие хранилища данных (такие как Databricks и BigQuery имеют свои собственные наборы параметров, которые могут быть установлены для столбцов в их операторах CTAS.

Вы можете реализовать ограничения несколькими способами:

 Пользовательские ограничения с тегами
 Пользовательские ограничения без тегов
0