单仓库中调用其他项目的dbt generate_schema_name宏失效求助
解决dbt多包环境下generate_schema_name宏不生效的Jinja原生方案
给你个纯Jinja的解决办法,既不违反DRY原则,也不用折腾复杂的CI动态生成:
步骤1:抽离核心逻辑为通用宏
在core包的宏目录下新建(或修改)一个宏文件,比如macros/generate_schema_name_core.sql,把原来的判断逻辑放进去,注意宏名不能叫generate_schema_name:
{% macro generate_schema_name_core(custom_schema_name, node) %} {% if target.name == 'prod' %} {{ custom_schema_name | trim }} {% else %} {{ target.schema | trim }}_{{ custom_schema_name | trim }} {% endif %} {% endmacro %}
步骤2:每个包本地写极简的generate_schema_name宏
因为dbt只会加载当前执行包根目录下的generate_schema_name宏,所以在core包和marketing包各自的macros/generate_schema_name.sql里,只需要调用上面的核心宏即可:
core包的本地宏:
{% macro generate_schema_name(custom_schema_name, node) %} {{ core.generate_schema_name_core(custom_schema_name, node) }} {% endmacro %}
marketing包的本地宏:
{% macro generate_schema_name(custom_schema_name, node) %} {{ core.generate_schema_name_core(custom_schema_name, node) }} {% endmacro %}
原理说明
dbt的规则是不会使用依赖包中的generate_schema_name宏,但允许调用依赖包中其他名称的宏。这种方式把核心逻辑统一维护在core包,每个业务包只需要一行调用代码,既满足dbt的加载要求,又完全复用逻辑,不会重复写代码。
内容的提问来源于stack exchange,提问作者Umar.H
相关产品推荐
相关产品推荐

