检测表以查看CI中的具体化更改

  • 本文关键字:具体化 CI 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.

谢谢!

有一种方法,但不是特别的"容易";。

您所能做的就是利用dbt生成的工件。

  • manifest.json:由compileruntestdocs generatels产生
  • run_results.json:由runtestseedsnapshotdocs generate产生
  • catalog.json:由docs generate生产

材料化变更信息可在run_resultsmanifest中找到。但是,在向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"

正如我所说,这不是";"容易";每个人都说,但我希望我的回答能给你一些关于如何获得你想要的东西的想法。如果你对更多细节感兴趣,你可以查看我关于这个主题的博客文章。

最新更新