python 在dbt中无法识别宏

wvt8vs2t  于 2022-12-21  发布在  Python
关注(0)|答案(2)|浏览(167)
{{ 
    config (
        pre_hook = before_begin("{{audit_tbl_insert(1,'stg_news_sentiment_analysis_incr') }}"),
        post_hook = after_commit("{{audit_tbl_update(1,'stg_news_sentiment_analysis_incr','dbt_development','news_sentiment_analysis') }}")
        )
}}

select rd.news_id ,rd.title, rd.description, ns.sentiment from live_crawler_output_rss.rss_data rd 
left join 
live_crawler_output_rss.news_sentiment ns 
on rd.news_id = ns.data_id limit 10000;

这是我在DBT中的模型,它配置了pre和post钩子,引用一个宏来插入和更新审计表。
我的宏

{ % macro audit_tbl_insert (model_id_no, model_name_txt) % }

{% set run_id_value = var('run_id') %}

insert into {{audit_schema_name}}.{{audit_table_name}} (run_id, model_id, model_name, status, start_time, last_updated_at)
values 
({{run_id_value}}::bigint,{{model_id_no}}::bigint,{{model_name_txt}},'STARTED',current_timestamp,current_timestamp)

{% endmacro %}

这是我第一次使用这个宏,我看到了下面的错误。

Compilation Error in model stg_news_sentiment_analysis_incr 
(models/staging/stg_news_sentiment_analysis_incr.sql)
'audit_tbl_insert' is undefined in macro run_hooks (macros/materializations/hooks.sql) 
called by macro materialization_table_default (macros/materializations/models/table/table.sql) called by model stg_news_sentiment_analysis_incr 
(models/staging/stg_news_sentiment_analysis_incr.sql). 
This can happen when calling a macro that does not exist. 
Check for typos and/or install package dependencies with "dbt deps".
kpbpu008

kpbpu0081#

宏定义中定义jinja块的大括号中有太多空格:

{ % macro audit_tbl_insert (model_id_no, model_name_txt) % }

需要

{% macro audit_tbl_insert (model_id_no, model_name_txt) %}

这样就可以了。

aiazj4mn

aiazj4mn2#

阅读错误,似乎正在调用您的宏;也许问题 * 不是 * 它没有被识别。注意stg_news_sentiment_analysis_incr在错误日志中被提及,并且它作为本书执行的宏的硬编码输入出现在您的第一个代码片段中。因此,错误似乎是在我们已经进入宏 * 之后 * 发生的。
那么是什么导致了这个错误呢?在第一行它说:
模型stg_news_sentiment_analysis_incr中的编译错误
阅读了你的代码,我不认为你 * 想要 * 编译这个模型。在我看来,你似乎试图把这个字符串插入到审计表中。但是你已经写了

pre_hook = before_begin("{{audit_tbl_insert(1,'stg_news_sentiment_analysis_incr') }}")

当钩子编译时,将调用以下代码:

{{ audit_tbl_insert(1,'stg_news_sentiment_analysis_incr') }}

这就是你的问题(如果我理解你的目的):'stg_news_sentiment_analysis_incr'将被传递到宏中,并被解释为模型的名称,而不是字符串。请参阅文档-其中一个示例显示了一个字段名被传递进来,并使用此语法 used 作为字段名。
在宏中,可以编写:

({{run_id_value}}::bigint,{{model_id_no}}::bigint,{{model_name_txt}},'STARTED',current_timestamp,current_timestamp)

从错误文本判断,它试图编译模型,该模型调用一个名为materialization_table_default的宏,该宏调用run_hooks,该宏试图引用名为corpository_audit_tbl_insert的东西,该东西并不存在(至少在编译时不存在)。

相关问题