如何在dbt宏中通过Jinja2字符串拼接正确传参给ref函数?
解决dbt宏中拼接表名传递给ref函数的编译错误
问题根源
你原来的写法里,用{% set load_table %}多行模板块生成表名时,会保留模板内的缩进、换行,而且手动添加的单引号也会被包含在最终字符串里。传给ref的参数变成了带多余空格、换行和引号的内容(比如错误信息里的'data_categories',连引号一起传进了ref),dbt自然找不到对应的节点。
正确写法
直接用字符串赋值的方式生成干净的表名字符串,不要用多行模板块定义变量:
{% macro my_fnc(prefix=None) %} {% set load_table = (prefix ~ '_data_categories') if prefix is defined else 'data_categories' %} {% set sql_statement %} select * from {{ ref(load_table) }} {% endset %} ... {% endmacro %}
关键改动说明
- 把原来的多行
{% set load_table %}块替换成一行变量赋值,直接完成字符串拼接,生成的load_table是纯表名字符串,没有多余的空格、换行和引号。 - 去掉了手动添加的单引号,因为
ref函数接收的是节点名称的字符串,不需要额外加引号。
这样修改后,ref(load_table)就能正确识别对应的表节点,编译错误即可解决。
内容的提问来源于stack exchange,提问作者Bryan
相关产品推荐
相关产品推荐

