DBT
April 16

Разные полезности в dbt (draft)

Решил собрать разные полезные при работе с dbt вещи в одной заметке. Все примеры для работы с PostgreSQL.

Использование функций ref и sources.

Не нужно использовать прямые ссылки на реальные таблицы БД, как вы это делаете в обычных запросах SQL. Вместо этого используйте функцию ref - для ссылки на существующую модель, и функцию sources.

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

Конфигурации

Пояснять буду на блоке конфигурации для модели ods_emp.sql. Весь код модели ниже.

{{ config
(materialized='table',
alias='emp',
schema='ods_scott',
tags=['ods_layer'],
enabled = true
)
}}
select * 
from scott.dept
{% if var('use_limit') == 1 %}
limit 1
{% endif %}

Явно указав значение alias и schema, при выполнении модели получим таблицу с именем emp (а не ods_emp, как название модели) в кастомной схеме ods_scott.

Указав тег ods_layer, можно запустить выполнение всех моделей с этим тегом таким образом:

dbt run --select tag:ods_layer
Запуск всех моделей с выбранным тегом

Кстати, если бы все модели с этим тегом лежали бы в папке models/ods - как у меня в учебном проекте - этот же результат получался командой

dbt run -m ods

При необходимости можно запустить все модели с указанным тегом, исключая указанные, используя флаг exclude

dbt run --select tag:ods_layer --exclude ods_emp

Если бы PostgreSQL поддерживал обращение к разным базам на одном инстансе, помимо параметра конфигурации schema можно было бы указать и в параметре database название БД, отличной от прописанной в файле profiles.yml. Но в постгресе так не получится, выбросится ошибка типа ERROR: Cross-db references not allowed in postgres.

Для enabled значение true по умолчанию, т.е. стоит использовать со значением false, если указанный ресурс по каким-то причинам нужно отключить, чтобы он не участвовал в проекте. Если нужно исключить модель из конкретного запуска, стоит использовать флаг exclude - смотри пример выше.

Запуск модели с переменными

Можно передать значение 1 переменной 'use_limit' нашей модели ods_emp при запуске из CLI таким образом:

dbt run -m ods_emp --vars "{'use_limit': 1}"

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

Analyses

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

При выполнении никакой объект в БД не материализуется, получаем готовый запрос ресурса analyses мы при компиляции, найти его можно в папке \target\compiled\dbt_edu_proj\analyses\

Analysis в проекте

Для подобных целей - хранений запросов в проекте без их материализации в БД - могут служить модели с материализацией типа ephemeral. Но в отличие от Analyses такие модели (для dbt это CTE) могут использоваться в сборке других. Что, скорее всего, упростит чтение и усложнит понимание кода.

Расширение dbt Power User для VS Code

Очень полезная вещь, кучу времени экономит.

Execute dbt SQL

Запускается из блока пиктограмм в правом верхнем углу IDE

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

Пример неуспешного запуска
Пример успешного запуска

Кстати, в терминале посмотреть вывод результатов - или сам факт, что результаты возвращаются, можно командой dbt show (ни же 2 варианта использования)

dbt show -m dds_emp_ext
dbt show --inline "select * from {{ ref('dds_emp_ext') }}"
Применение команды dbt show

Lineage

Можно смотреть lineage сразу в IDE, без использования других инструментов. Находится через верхнее меню Terminal=> New Terminal.

Для примера на рисунке ниже это не очень важная опция, но если моделей уже порядка десятка, это сильно облегчает жизнь.

Очень полезная пиктограмма для показа скомилированного кода в соседнем окне IDE Compiled dbt Preview:

Есть пиктограммы, которые просто дублируют команды терминала dbt run, dbt test, dbt compile.