使用dbt批量部署存储过程时宏代码报错‘list’未定义,如何修复?
解决dbt批量执行存储过程宏的编译错误
你的代码出现'list' is undefined错误,以及无法正确获取宏的问题,主要有两处关键问题需要修正,以下是修改后的完整代码及说明:
修改后的宏代码
{% macro run_all_procedure_macros() %} {# 初始化空列表存储要执行的宏名称 #} {% set procedures_to_run = [] %} {# 遍历所有宏,筛选出procedures目录下的宏 #} {% for macro in graph.macros.values() %} {% if macro.path.startswith('procedures/') %} {% do procedures_to_run.append(macro.name) %} {% endif %} {% endfor %} {# 打印要执行的宏并逐个调用执行 #} {% for proc_name in procedures_to_run %} {{ log('正在执行存储过程宏: ' ~ proc_name, info=True) }} {{ execute(proc_name) }} {% endfor %} {% endmacro %}
关键修改点说明
- 列表初始化方式:Jinja2环境中不能直接使用Python的
list()创建空列表,需改用[],这是导致编译错误的直接原因。 - 遍历对象修正:dbt的
graph.nodes存储的是模型、快照、种子等数据对象,宏的元数据实际在graph.macros中,因此要切换遍历目标为graph.macros.values()。 - 添加宏执行逻辑:原代码仅打印宏名称,新增
{{ execute(proc_name) }}来实际调用每个存储过程宏。 - 路径判断调整:若你的宏文件放在项目根目录的
macros/procedures/下,宏的path属性会是procedures/[宏文件名],因此用startswith('procedures/')更准确,可根据实际目录结构自行调整。
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

