Раздел 26 · Data Engineering

Окружения dev и prod и dbt в Airflow

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Пока проект «Гонца» жил только у тебя на ноутбуке, ты запускал dbt build руками и смотрел на результат. Теперь витрину Отто должны пересобирать каждое утро, сразу после того как DAG gonets_daily загрузил вчерашние заказы. И делать это не в твоей схеме dbt_dev, где ты экспериментируешь, а там, откуда читает дашборд. Нужно два окружения и оркестратор, который запустит dbt в правильный момент.

Репетиция и спектакль

В театре есть репетиционный зал и сцена. Пьеса одна, актёры те же, но на репетиции можно остановиться посреди сцены, перепутать реплику, попробовать другой свет. Зритель этого не видит. На сцену выходят, когда всё отрепетировано, и там ошибка стоит дорого.

У dbt то же самое. Проект один, а запускать его можно в разные окружения: в твою личную схему для репетиций и в общую продовую для зрителей.

Таргеты в profiles.yml

Окружение в dbt описывается таргетом, это блок внутри профиля из урока про profiles.yml:

gonets:
  target: dev
  outputs:
    dev:
      type: postgres
      host: localhost
      port: 5432
      user: student
      password: student
      dbname: gonets
      schema: dbt_dev
      threads: 1
    prod:
      type: postgres
      host: localhost
      port: 5432
      user: student
      password: student
      dbname: gonets
      schema: analytics
      threads: 1

Ключ target: dev говорит, какой таргет брать по умолчанию. Обычная команда dbt build пишет в dbt_dev, а dbt build --target prod в analytics. Код моделей при этом не меняется: ref() сам подставит нужную схему.

На настоящем проде пользователь и пароль другие, и их не хранят в файле открытым текстом. Пишут password: "{{ env_var('DBT_PROD_PASSWORD') }}", а значение кладут в переменную окружения на сервере.

target внутри моделей

Имя таргета доступно в Jinja как target.name, схема как target.schema. Так в разработке можно брать не весь объём данных, а последнюю неделю, чтобы модели собирались быстрее:

select *
from {{ source('raw', 'orders') }}
{% if target.name == 'dev' %}
where created_at >= '2026-06-24'
{% endif %}

И через target.name чаще всего переопределяют generate_schema_name из урока про dbt_project.yml: в dev всё складывают в личную схему, а на проде витрины кладут ровно в marts. Это и будет задачей урока.

урок из курса

Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.