首页 > 解决方案 > dbt post hook 关系“my_table”不存在

问题描述

我正在使用 dbt 构建一些模型。

我有一个模型,所以 -

SELECT
  COALESCE(
    col1, col2
  ) AS col,
  ....
FROM
  {{ source(
    'db',
    'tbl'
  ) }}
  WHERE ....

这个模型有一个配置部分调用一个宏

{{- config(
  post_hook = [macro()],
  materialized='table'
) -}}

在我使用的宏中{% if execute %},我还登录以检查执行值{{ log('Calling update macro with exec value = ' ~ execute) }}

当我运行时,dbt compile我不希望宏根据文档触发。但是,它确实并且实际上将执行设置为 true 以触发更新并导致错误,因为表不存在。我错过了什么还是这是一个 dbt 错误?我很困惑!

这是日志中的一行 - 2021-09-15 20:48:16.864555 (Thread-1): Calling update macro with exec value = True

..错误是 relation "schema.my_table" does not exist

感谢任何人可能有的指针,谢谢

标签: dbt

解决方案


好的,这就是我对 dbt 的发现。

当您dbt compiledbt run第一次时,数据库中尚不存在表。但是,编译和运行都会检查 db 对象是否存在,否则会抛出错误。所以,无论我使用什么,我在宏中的选择都失败了{% if execute %}

我打电话adapter.get_relation()来检查表是否存在 -

{%- set source_relation = adapter.get_relation(
        database=this.database ,
        schema=this.schema,
        identifier=this.name) -%}

并使用检查条件 -

{% set table_exists=source_relation is not none  %}

对于增量运行,修复更容易 -

{% if execute and is_incremental() %}

现在,我的代码是固定的:)


推荐阅读