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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:06:05