使用DBT宏时结果异常:循环外变量值未更新
DBT宏循环内修改变量后外部值未更新的解决办法
问题原因
Jinja2(DBT依赖的模板引擎)中,for循环会生成独立的局部作用域。你原代码里,循环内的{% set value = value + 1 %}其实是在循环作用域内创建了新的局部变量value,而非修改外部定义的全局value。所以循环结束后,外部的value依然保持初始值0。
解决方案
使用Jinja2的namespace对象封装变量。namespace是可变对象,修改它的属性时会直接修改原对象,不会产生局部作用域的隔离问题。
修改后的完整代码
{% set ns = namespace(value=0) %} {% for key , v in metrics.items() %} {% if col in v %} {% set ns.value = ns.value + 1 %} {{ ns.value }} {{ key }}({%- if relation_alias %}{{ relation_alias }}.{{ col|trim }}){%- endif -%} {% endif %} {% endfor %} {{ ns.value }}
代码说明
- 用
namespace(value=0)替代直接变量定义,把value作为ns对象的属性 - 循环内修改时直接操作
ns.value,修改的是原namespace对象的属性,不会创建局部变量 - 输出时使用
ns.value获取最新变量值
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

