Первая модель: model = SELECT

Самая важная идея dbt в одном предложении: модель — это просто SELECT.

Модель (model) — это файл .sql с единственным запросом SELECT; dbt оборачивает его в CREATE TABLE AS или CREATE VIEW AS и создаёт объект в хранилище с именем файла.

Минимальная модель

Создайте файл models/customers.sql. В нём — только SELECT. Никаких CREATE, DROP — dbt допишет их сам.

-- models/customers.sql
select
    id as customer_id,
    first_name,
    last_name,
    email
from raw.customers

Запустите dbt run. dbt прочитает файл, обернёт запрос и выполнит в хранилище:

-- что dbt на самом деле отправит хранилищу (упрощённо)
create view dbt_dev.customers as (
    select id as customer_id, first_name, last_name, email
    from raw.customers
);

Имя объекта (customers) берётся из имени файла, а схема — из profiles.yml. Так файл customers.sql становится представлением customers в вашей схеме.

Проверим логику на живой песочнице

Сама трансформация — обычный SQL. Вот эквивалент того, что делает модель, в исполнимом виде:

CREATE TABLE raw_customers (id INTEGER, first_name TEXT, last_name TEXT, email TEXT);
INSERT INTO raw_customers VALUES
  (1, 'Анна', 'Иванова', '[email protected]'),
  (2, 'Пётр', 'Петров', '[email protected]');

-- тело модели: просто SELECT
select
    id as customer_id,
    first_name,
    last_name,
    email
from raw_customers;

Команда запуска

# Построить все модели
dbt run

# Построить только одну модель
dbt run --select customers

Как работает под капотом

dbt не хранит результат у себя — он только генерирует и отправляет DDL. По умолчанию модель материализуется как view (представление): запрос пересчитывается при каждом обращении. dbt оборачивает ваш SELECT в нужный CREATE, подставляет имя из файла и схему из профиля. Если объект уже существует, dbt сперва дропнет старый и создаст заново — поэтому модели идемпотентны: повторный запуск даёт тот же результат.

Частые ошибки

  • Писать CREATE TABLE в модели. Не нужно — dbt сам решает, как материализовать. В модели только SELECT.
  • Ставить точку с запятой в конце. dbt оборачивает запрос, и лишняя ; ломает обёртку — её не пишут.
  • Жёстко прописывать имя схемы в FROM. Для ссылок на другие модели есть ref() (следующий раздел), а не хардкод схемы.

Итоги

  • Модель — это файл .sql с единственным SELECT.
  • dbt сам оборачивает его в CREATE VIEW/TABLE, имя берёт из файла, схему — из профиля.
  • Никаких CREATE, ; в конце или хардкода схемы — это работа dbt.
Проверьте себя
1. Что должно быть внутри файла модели dbt?
ACREATE TABLE и INSERT
BТолько запрос SELECT
CКоманда dbt run
DНастройки подключения
2. Откуда dbt берёт имя создаваемого объекта в хранилище?
AИз первой строки SELECT
BИз имени файла модели
CИз profiles.yml
DСлучайно генерирует
3. Какой материализацией создаётся модель по умолчанию?
Atable
Bview (представление)
Cincremental
Dseed