dbt Jinja中环境变量在if语句中不生效的问题求助
问题排查与解决
核心问题:你混淆了dbt项目变量和系统环境变量的读取方式——env_var()是用来读取系统环境变量的,而你通过--vars传递的是dbt的项目变量,所以env_var('dbt_evar_curr_annual')根本没获取到你传入的值,导致if分支判断失败,走了else逻辑。
两种解决方法
方法一:直接使用dbt项目变量(推荐)
把代码中所有的env_var('dbt_evar_curr_annual')替换为var('dbt_evar_curr_annual'),var()是dbt专门用来读取--vars传递的项目变量的函数。
修改后的代码如下:
{{ config( materialized='incremental', pre_hook=" {% if var('dbt_evar_curr_annual') == 'Y' %} Truncate {{this}} {% endif %} " ) }} SELECT {% if var('dbt_evar_curr_annual') == 'Y' %} 1 As ID, 'annual' As NAME {% else %} 2 As ID, {{var('dbt_evar_curr_annual')}} As NAME {% endif %} FROM DUAL
运行命令保持不变(建议给变量参数加引号,避免shell解析问题):
dbt run -m test_if3 --vars '{dbt_evar_curr_annual:Y}'
这样就能正确进入if分支,加载ID=1、NAME='annual'的行,同时触发pre_hook中的truncate操作。
方法二:改用系统环境变量传递
如果一定要用env_var(),需要先在系统中设置对应的环境变量,再运行dbt:
- Bash/Zsh环境:
export dbt_evar_curr_annual=Y dbt run -m test_if3 - Windows Cmd环境:
set dbt_evar_curr_annual=Y dbt run -m test_if3
此时env_var('dbt_evar_curr_annual')就能读取到系统环境变量的值,进入预期分支。
额外注意
--vars的标准格式是JSON格式,比如--vars '{"dbt_evar_curr_annual": "Y"}',简化格式{dbt_evar_curr_annual:Y}虽然dbt支持,但在部分shell环境下可能需要加单引号避免解析错误。
内容的提问来源于stack exchange,提问作者Srinivasarao Kotipatruni
相关产品推荐
相关产品推荐

