DBT宏开头的if代码块被忽略 如何实现正常输出WITH或逗号?
问题成因
这是dbt 0.18.x版本的固有特性:编译SQL时会默认修剪文件最开头的所有空白内容,以及没有固定前置文本、完全由jinja控制块动态生成的开头内容,只有当开头存在固定非空白字符时,后续的jinja逻辑才会正常渲染。你把代码块放在CTE之后、或者前面加固定文本时能正常运行,就是符合这个逻辑的表现。
解决方案
你可以任选以下任意一种方式修改宏代码即可实现预期效果:
方案1:添加强制空输出标记
在宏的最开头加入一行空字符串输出,强制dbt识别到开头有有效输出,不会修剪后续内容:
{% macro my_macro(table, first=false) %} {{- '' -}} {%- if first -%} WITH {%- else -%} , {% endif %} tmp AS (...
方案2:改用表达式直接输出内容
把条件判断直接写在jinja输出语句里,避免用纯控制块包裹输出内容:
{% macro my_macro(table, first=false) %} {{- 'WITH' if first else ',' -}} tmp AS (...
方案3:升级dbt版本
该问题在dbt 1.0及以上版本已经被官方修复,升级到更高稳定版本后不需要额外修改宏代码也可以正常运行。
内容的提问来源于stack exchange,提问作者CSquare
相关产品推荐
相关产品推荐

