#dbt
#dbt
Вопрос:
Есть ли простой способ обнаружить изменение в материализации в CI, чтобы избежать сбоя при запуске dbt с ошибкой
Compilation Error in model stores_stores
(models/marts/core/blah.sql) Trying to create view
`blah`.`dbt`.`blah`, but it currently exists as a
table. Either drop `blah`.`dbt`.`blah` manually,
or run dbt with `--full-refresh` and dbt will drop it for you.
Спасибо!
Ответ №1:
Есть способ, однако он не особенно «легкий».
Что вы можете сделать, так это использовать артефакты, которые генерирует dbt.
manifest.json
: создаетсяcompile
,run
,test
,docs generate
,ls
run_results.json
: создаетсяrun
,test
,seed
,snapshot
,docs generate
catalog.json
: создаетсяdocs generate
Информацию об изменении материализации можно найти как в , так run_results
и в manifest
. Однако в вашем контексте добавления проверки в CI для раннего сбоя вы хотите получать уведомления до получения ошибки от a dbt run
. Таким образом, вы могли бы фактически сгенерировать manifest.json
with dbt compile
.
В nodes
ключе манифеста у каждого узла будет config.materialized
ключ, на который вы можете посмотреть. Вы можете проанализировать это с помощью командной строки или с помощью python и сохранить результат в файле JSON, который содержит информацию о материализации каждой модели. Этот файл может быть возвращен в ваш код, например.
cat target/manifest.json | jq '.nodes | to_entries | map({node: .key, materialized: .value.config.materialized})' > old_state.json
Затем, после того, как вы внесли изменения в свой dbt-код, вам нужно выполнить
dbt compile # generates new manifest.json
cat target/manifest.json | jq '.nodes | to_entries | map({node: .key, materialized: .value.config.materialized})' > new_state.json
Затем вы можете сравнить два состояния, например diff
, в командной строке. Я приведу пример вывода здесь:
$ diff old_state.json new_state.json
12c12
< "materialized": "table"
---
> "materialized": "view"
Как я уже сказал, это не «легко» сказать, но я надеюсь, что мой ответ дал вам несколько идей о том, как действовать, чтобы получить то, что вы хотите. Если вас интересует более подробная информация, вы можете проверить мой пост в блоге по этой теме.