Разные полезности в 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\
Для подобных целей - хранений запросов в проекте без их материализации в БД - могут служить модели с материализацией типа 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') }}"
Lineage
Можно смотреть lineage сразу в IDE, без использования других инструментов. Находится через верхнее меню Terminal=> New Terminal.
Для примера на рисунке ниже это не очень важная опция, но если моделей уже порядка десятка, это сильно облегчает жизнь.
Очень полезная пиктограмма для показа скомилированного кода в соседнем окне IDE Compiled dbt Preview:
Есть пиктограммы, которые просто дублируют команды терминала dbt run, dbt test, dbt compile.