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

SQL модели

Связанные справочные документы

Начало работы

Создание ваших первых моделей

Если вы новичок в dbt, мы рекомендуем вам прочитать руководство по быстрому старту, чтобы создать ваш первый проект dbt с моделями.

Возможности Python в dbt являются расширением его возможностей с SQL моделями. Если вы новичок в dbt, мы рекомендуем сначала прочитать эту страницу, прежде чем переходить к: "Python модели".

SQL модель — это оператор select. Модели определяются в файлах .sql (обычно в вашем каталоге models):

  • Каждый файл .sql содержит одну модель / оператор select.
  • Имя модели наследуется от имени файла.
  • Мы настоятельно рекомендуем использовать подчеркивания в именах моделей, а не точки. Например, используйте models/my_model.sql вместо models/my.model.sql.
  • Модели могут быть вложены в подкаталоги внутри каталога models.

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

Когда вы выполняете команду dbt run, dbt создаст эту модель обернув её в оператор create view as или create table as.

Например, рассмотрим эту модель customers:

models/customers.sql
with customer_orders as (
select
customer_id,
min(order_date) as first_order_date,
max(order_date) as most_recent_order_date,
count(order_id) as number_of_orders

from jaffle_shop.orders

group by 1
)

select
customers.customer_id,
customers.first_name,
customers.last_name,
customer_orders.first_order_date,
customer_orders.most_recent_order_date,
coalesce(customer_orders.number_of_orders, 0) as number_of_orders

from jaffle_shop.customers

left join customer_orders using (customer_id)

Когда вы выполняете dbt run, dbt создаст это как представление с именем customers в вашей целевой схеме:

create view dbt_alice.customers as (
with customer_orders as (
select
customer_id,
min(order_date) as first_order_date,
max(order_date) as most_recent_order_date,
count(order_id) as number_of_orders

from jaffle_shop.orders

group by 1
)

select
customers.customer_id,
customers.first_name,
customers.last_name,
customer_orders.first_order_date,
customer_orders.most_recent_order_date,
coalesce(customer_orders.number_of_orders, 0) as number_of_orders

from jaffle_shop.customers

left join customer_orders using (customer_id)
)

Почему представление с именем dbt_alice.customers? По умолчанию dbt будет:

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

Вы можете использовать конфигурации, чтобы изменить любое из этих поведений — об этом позже.

Часто задаваемые вопросы

Как увидеть SQL, который выполняет dbt?
Нужно ли создавать целевую схему перед запуском dbt?
Если я перезапущу dbt, будет ли простой, пока модели перестраиваются?
Что произойдет, если в моем SQL-запросе ошибка или я получу ошибку базы данных?
В каком SQL-диалекте писать мои модели? Или какой SQL-диалект использует dbt?

Конфигурирование моделей

Конфигурации — это "настройки модели", которые можно задать в вашем файле dbt_project.yml, и в вашем файле модели, используя блок config. Примеры конфигураций включают:

  • Изменение используемого моделью — материализация определяет SQL, который dbt использует для создания модели в вашем хранилище данных.
  • Создание моделей в отдельных схемах.
  • Применение тегов к модели.

Вот пример конфигурации модели:

dbt_project.yml
name: jaffle_shop
config-version: 2
...

models:
jaffle_shop: # это соответствует `name:`` конфигурации
+materialized: view # это применяется ко всем моделям в текущем проекте
marts:
+materialized: table # это применяется ко всем моделям в каталоге `marts/`
marketing:
+schema: marketing # это применяется ко всем моделям в каталоге `marts/marketing/`

models/customers.sql

{{ config(
materialized="view",
schema="marketing"
) }}

with customer_orders as ...

Важно отметить, что конфигурации применяются иерархически — конфигурация, примененная к подкаталогу, переопределит любые общие конфигурации.

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

Часто задаваемые вопросы

Какие материализации доступны в dbt?
Какие существуют конфигурации моделей?

Построение зависимостей между моделями

Вы можете строить зависимости между моделями, используя функцию ref вместо имен таблиц в запросе. Используйте имя другой модели в качестве аргумента для ref.

models/customers.sql
with customers as (

select * from {{ ref('stg_customers') }}

),

orders as (

select * from {{ ref('stg_orders') }}

),

...

dbt использует функцию ref для:

  • Определения порядка выполнения моделей, создавая ориентированный ациклический граф (DAG).
DAG для нашего dbt проектаDAG для нашего dbt проекта
  • Управления отдельными средами — dbt заменит модель, указанную в функции ref, на имя базы данных для (или представления). Важно, что это учитывает среду — если вы запускаете dbt с целевой схемой, названной dbt_alice, он будет выбирать из вышестоящей таблицы в той же схеме. Посмотрите на вкладки выше, чтобы увидеть это в действии.

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

Тестирование и документирование моделей

Вы также можете документировать и тестировать модели — перейдите к разделу о тестировании и документировании для получения дополнительной информации.

Дополнительные часто задаваемые вопросы

Есть ли примеры dbt моделей?
Могу ли я хранить свои модели в каталоге, отличном от каталога `models` в моем проекте?
Могу ли я создавать свои модели в схеме, отличной от целевой, или распределять модели по нескольким схемам?
Должны ли имена ресурсов, используемых в ref, быть уникальными?
Как удалить удаленные модели из моего хранилища данных?
Как я должен организовать свой проект, когда создаю больше моделей? Как я должен называть свои модели?
Если модели могут быть только `select` запросами, как вставлять записи?
Почему я не могу просто писать DML в своих трансформациях?
Как задать типы столбцов?
0