You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:06:07