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 compile
或dbt 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 - 无法创建有效负载