Первая модель: 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.