0

是否有一种简单的方法可以检测 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.

谢谢!

4

1 回答 1

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 添加检查以便提前失败的上下文中,您希望在收到来自dbt run. 所以你实际上可以生成manifest.jsonwith 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在命令行中使用 eg 比较两种状态。我将在这里放置一个示例输出:

$ diff old_state.json new_state.json
12c12
<     "materialized": "table"
---
>     "materialized": "view"

正如我所说,这并不“容易”,但我希望我的回答能给你一些关于如何继续得到你想要的东西的想法。如果您对更多细节感兴趣,可以查看我关于该主题的博客文章

于 2020-12-21T10:35:07.663 回答