dbt post hook 关系“my_table”不存在

Posted

技术标签:

【中文标题】dbt post hook 关系“my_table”不存在【英文标题】:dbt post hook relation "my_table" does not exist 【发布时间】:2021-09-15 21:05:13 【问题描述】:

我正在使用 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 时,我不希望宏根据documentation 触发。但是,它确实并且实际上将执行设置为 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

感谢任何人的指点,谢谢

【问题讨论】:

1.上面引用的模型文件实际上是否称为my_table?所以你应该能够用dbt compile -m my_table 重现错误,对吗? 2. 你没有将 this 作为参数传递给你的宏有什么原因吗? 您好@AndersSwanson - 感谢您的回复。我没有传递 this ,因为我可以在不显式传递的情况下访问它。我从日志中得到了错误,这指向了我正在更新模型的 post hook 宏。 【参考方案1】:

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

当您第一次dbt compiledbt run 时,数据库中尚不存在这些表。但是,both 编译和运行都会检查 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() %

现在,我的代码已修复 :)

【讨论】:

感谢您的跟进和分享您学到的东西!不要在同一点上竖琴,但我想知道在编译时是否需要使用 this 。可能值得一试,并且不需要您的is not none 检查? @AndersSwanson-没问题!只是试过了,还是没有运气!我从这个问题中学到了更多。我的假设是 post_hook 在模型之后运行。令我惊讶的是,这并不完全正确。如果第一次构建模型,并且post-hook 调用一个引用模型的宏(在我的例子中是获取max(created_date) 并将其插入另一个表中),尽管运行完成且没有错误,但在第一次运行中不会发生插入。只有随后的运行会插入记录,因为那时该表实际存在。总有东西要学:) 你看过table物化是如何工作的吗? def 值得一试。您可以看到钩子是您所说的“模型创建”的一部分。 github.com/dbt-labs/dbt/blob/develop/core/dbt/include/… 感谢您分享 GitHub 链接 @AndersSwanson。提交发生在post_hook 之后,这向我解释了一切!

以上是关于dbt post hook 关系“my_table”不存在的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 dbt 中运行模型时出现“关系 <y> 的列 <x> 不存在”错误,但在 SQL 客户端中运行时却没有?

使用 dbt_utils.union_relations 错误但不知道如何/为啥?

react-hook-form axios post - 无法创建有效负载

sh Wakatime Git post-commit hook

GET/POST/g和钩子函数(hook)

TypeScript 中的 Mongoose post hook 类型错误