如何在DBT的Jinja循环中嵌套set定义多个查询变量?
解决方案
Jinja 不支持直接通过 {% set %} 动态定义变量名(也就是你尝试的 {% set {{i}} %} 写法),但可以通过两种方式实现你的需求:
方法一:用字典存储所有查询片段
这是最简洁且符合 DBT/Jinja 最佳实践的方式,把每个查询片段存在字典的键值对里:
{% set attributes = ('value1', 'value2', 'value3') %} {% set query_dict = {} %} {% for attr in attributes %} {% set current_query %} select category1, category2, category3, category4 from {{ ref('table') }} where category1 = '{{ attr }}' -- 注意加单引号,确保是字符串匹配 order by category2 {% endset %} {% do query_dict.update({attr: current_query}) %} {% endfor %}
使用时直接通过字典键调用:
-- 引用value1对应的查询 {{ query_dict['value1'] }} -- 引用value2对应的查询 {{ query_dict['value2'] }}
方法二:用namespace创建动态变量
如果一定要生成单独的变量(而非字典),可以借助 Jinja 的 namespace 对象(它是可变的,支持动态添加属性):
{% set attributes = ('value1', 'value2', 'value3') %} {% set ns = namespace() %} {% for attr in attributes %} {% set current_query %} select category1, category2, category3, category4 from {{ ref('table') }} where category1 = '{{ attr }}' order by category2 {% endset %} {% set ns[attr] = current_query %} {% endfor %}
使用时通过namespace对象访问变量:
-- 引用value1对应的查询 {{ ns.value1 }} -- 或者用键索引 {{ ns['value1'] }}
注意点
你原来的代码中,value2 和 value3 的 where 条件没有加单引号,会被Jinja解析为列名而非字符串值,记得补上单引号避免语法错误。
内容的提问来源于stack exchange,提问作者mbd0199
相关产品推荐
相关产品推荐

