You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单仓库中调用其他项目的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 01:22:05