是否有一种简单的方法来检测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.
谢谢!
有一种方法,但不是特别的"容易";。
您所能做的就是利用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添加检查以提前失败的情况下,您希望在收到来自dbt run
的错误之前得到通知。所以你实际上可以用dbt compile
生成manifest.json
。
在清单的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"
正如我所说,这不是";"容易";每个人都说,但我希望我的回答能给你一些关于如何获得你想要的东西的想法。如果你对更多细节感兴趣,你可以查看我关于这个主题的博客文章。