使用dbt时如何在YAML文件中调用Jinja自定义宏?
dbt YAML配置调用自定义宏提示“test_macro is undefined”的解决办法
问题原因
不是YAML文件不支持自定义宏,而是你的宏没有被dbt加载到可用的上下文环境中。dbt对宏的加载有固定规则:只有放在项目根目录下的macros/文件夹内的.sql文件中的宏,才会被dbt自动识别并加载,才能在模型YAML、SQL文件里调用。如果你的宏写在其他位置,dbt找不到就会报“undefined”错误。
解决步骤
存放宏到指定目录
把你的test_macro宏保存到macros/文件夹下的任意.sql文件中,比如创建macros/env_tag_macro.sql,内容如下:{% macro test_macro(target) %} {%- if target.name == "dev" -%} DEV {%- elif target.name == "prod" -%} PROD {%- else -%} invalid {%- endif -%} {% endmacro %}在YAML中正常调用
之后再在模型配置YAML里调用宏就可以正常识别了:models: - name: test_view description: "test" config: meta: database_tags: ACCOUNT_OBJECTS.TAGS.ENV: {{ test_macro(target) }}
替代方案:直接内嵌Jinja逻辑
如果不想单独写宏,也可以直接在YAML里内嵌Jinja判断逻辑,省去单独维护宏文件的步骤:
models: - name: test_view description: "test" config: meta: database_tags: ACCOUNT_OBJECTS.TAGS.ENV: {% if target.name == "dev" %}DEV{% elif target.name == "prod" %}PROD{% else %}invalid{% endif %}
内容的提问来源于stack exchange,提问作者TheLoneGrape
相关产品推荐
相关产品推荐

