DBT models中如何通过查询创建变量并在If语句中使用
问题原因及解决方案
核心错误原因
你遇到的编译错误由两个Jinja语法使用不当导致:
- 在
{% if %}这类Jinja控制语句块内部,直接引用变量即可,不需要嵌套{{ }}。{{ }}仅用于在SQL正文区域输出变量值,放在控制块内会触发语法解析错误,这也是报错提示expected token ':', got '}'的直接来源 - Jinja的条件判断语法不需要在语句末尾加Python风格的冒号
:
修正后的代码
{%- call statement(name='get_last_snapshot_date', fetch_result=True) -%} Select ifnull(max(snapshot_date),'9999-09-09') from my_data_source {%- endcall -%} {%- set data_last_snapshot_date = load_result('get_last_snapshot_date') -%} {%- set last_snapshot_date = data_last_snapshot_date['data'][0][0] -%} {%- call statement(name='get_current_date', fetch_result=True) -%} Select current_date('GB') {%- endcall -%} {%- set data_get_current_date = load_result('get_current_date') -%} {%- set current_snapshot_date = data_get_current_date['data'][0][0] -%} {% if current_snapshot_date == last_snapshot_date %} Delete From my_data_source Where snapshot_date = current_snapshot_date {% endif %}
额外注意事项
DBT标准SQL模型默认会将整段代码的运行结果作为表/视图的生成依据,如果你需要单独执行DELETE操作,建议将这段逻辑放到模型的pre-hook配置中,避免影响模型本身的物化逻辑。如果你的模型是增量快照类型,也可以直接使用DBT原生的增量配置实现相同逻辑,不需要手动写删除语句。
内容的提问来源于stack exchange,提问作者Rafal
相关产品推荐
相关产品推荐

