dbt的dbt_project.yml嵌套变量内部值如何访问
dbt嵌套变量取值方案
1. 先修正dbt_project.yml的变量定义
你当前的变量定义存在两个格式问题,会导致取值异常:
- 缩进不规范:project1下的vendor层级缩进错误,同层级key需要对齐
- 重复键覆盖:case_types下重复使用name作为key,YAML中同层级重复键会发生覆盖,最终仅会保留最后一个CASE4的值,多值场景请使用列表格式
修正后的正确定义如下:
vars: # 变量定义 project1: vendor: - ABC - DEF ABC: model: name: model123 case_types: - CASE1 - CASE2 - CASE3 - CASE4
2. 嵌套变量的取值方法
你之前直接遍历var('ABC')只能拿到第一层的key(model、case_types),根据使用场景可以选择两种取值方式:
已知变量结构的固定路径取值
如果清楚变量的嵌套结构,可以直接按层级取对应值,示例代码如下:
{% set abc_var = var('ABC') %} -- 直接取model的name值 {{ log("model名称:" ~ abc_var.model.name, True) }} -- 遍历case_types下的所有case值 {% for case in abc_var.case_types %} {{ log("case类型:" ~ case, True) }} {% endfor %}
运行后会依次输出model123、CASE1、CASE2、CASE3、CASE4。
未知结构递归遍历所有嵌套值
如果变量结构不固定,需要递归取出所有层级的最终值,可以自定义Jinja递归宏实现,示例如下:
{% macro traverse_nested_var(var_obj) %} {% if var_obj is mapping %} {% for key, value in var_obj.items() %} {{ traverse_nested_var(value) }} {% endfor %} {% elif var_obj is iterable and var_obj is not string %} {% for item in var_obj %} {{ traverse_nested_var(item) }} {% endfor %} {% else %} {{ log("嵌套值:" ~ var_obj, True) }} {% endif %} {% endmacro %} -- 调用宏遍历ABC变量的所有底层值 {% set abc_var = var('ABC') %} {{ traverse_nested_var(abc_var) }}
内容的提问来源于stack exchange,提问作者Mrinal
相关产品推荐
相关产品推荐

