如何使用Jinja动态调用dbt宏?解决字符串不可调用错误
在Jinja/dbt中动态调用宏的方法
你遇到的问题是因为把字符串当成了可调用的宏对象来用,直接用{{ macro_name(my_column) }}调用字符串自然会抛出“字符串不可调用”的错误。下面是两种可行的解决方法:
方法一:通过Jinja的context对象调用
dbt会把所有已加载的宏注册到Jinja的上下文(context)中,你可以通过字符串键来获取对应的宏对象,然后调用它:
{%- set macro_names = ["cast_to_string", "convert_empty_string_to_null_value"] -%} select {% for macro_name in macro_names %} {{ context[macro_name](my_column) }} as my_column_{{ loop.index }}, {% endfor %} from my_model
注意:自定义宏需要放在dbt项目的macros目录下(dbt会自动加载该目录下的宏),或者通过{% import %}语句导入到当前模型中,否则context里找不到对应的宏。
方法二:提前建立宏名与宏对象的映射字典
如果不想依赖context的隐式加载,可以手动创建一个字典,把宏名和对应的宏对象关联起来,再通过字符串键调用:
{%- set macro_mapping = { "cast_to_string": cast_to_string, "convert_empty_string_to_null_value": convert_empty_string_to_null_value } -%} {%- set macro_names = ["cast_to_string", "convert_empty_string_to_null_value"] -%} select {% for macro_name in macro_names %} {{ macro_mapping[macro_name](my_column) }} as my_column_{{ loop.index }}, {% endfor %} from my_model
这种方式更直观,也能避免因上下文加载问题导致的找不到宏的情况,适合宏数量较少的场景。
内容的提问来源于stack exchange,提问作者lux7
相关产品推荐
相关产品推荐

