DBT --vars选项无法覆盖dbt_project.yml文件变量值问题
问题现象
在dbt_project.yml中定义了全局变量RECON_INPUT: "ABC",运行模型时通过dbt run --select AUD_RECON_INPUT --vars '{"RECON_INPUT":"XYZ"}'尝试覆盖变量,但模型仍使用ABC,导致数据库报错找不到对象:
02:04:13 Database Error in model AUD_RECON_INPUT (models\AUD_RECON_INPUT.sql)
02:04:13 002003 (42S02): SQL compilation error:
02:04:13 Object 'ETS_REVAP02_DB_DEV.REVAP_AUDIT.ABC' does not exist or not authorized.
02:04:13
02:04:13 Done. PASS=0 WARN=0 ERROR=1 SKIP=0 TOTAL=1
排查与解决步骤
1. 检查模型中的变量引用语法
确保模型文件AUD_RECON_INPUT.sql中正确使用dbt变量语法:
-- 正确写法 SELECT * FROM ETS_REVAP02_DB_DEV.REVAP_AUDIT.{{ var('RECON_INPUT') }}
如果直接硬编码ABC,或者引用语法错误(比如漏写var()、引号格式错误),命令行传入的变量根本不会生效。
2. 确认dbt_project.yml中的变量定义层级
变量必须定义在vars根节点下,才是全局可覆盖的变量:
# 正确的全局变量定义 vars: RECON_INPUT: "ABC"
如果变量是定义在模型专属配置中(如下),虽然命令行仍可覆盖,但需确保引用逻辑匹配,通常不推荐这种方式:
models: your_project_name: AUD_RECON_INPUT: vars: RECON_INPUT: "ABC"
3. 修正命令行参数的引号格式(针对Windows系统)
Windows的CMD对单引号支持不佳,需调整--vars的引号格式:
- 方法1:用转义双引号包裹
dbt run --select AUD_RECON_INPUT --vars "{\"RECON_INPUT\":\"XYZ\"}"
- 方法2:使用PowerShell执行原命令(PowerShell支持单引号)
Linux/macOS系统下原命令格式是正确的,无需调整。
4. 检查变量名称大小写
dbt变量名区分大小写,确保命令行传入的RECON_INPUT和dbt_project.yml中的变量名完全一致,避免因大小写差异被识别为不同变量。
5. 验证变量实际传入值
在模型中添加日志输出,快速确认变量是否正确传入:
{{ log('当前RECON_INPUT变量值:' ~ var('RECON_INPUT'), info=True) }} SELECT * FROM ETS_REVAP02_DB_DEV.REVAP_AUDIT.{{ var('RECON_INPUT') }}
运行dbt后查看日志,如果输出XYZ说明变量已传入,问题出在模型其他逻辑;如果输出ABC说明变量未被覆盖,回到前面的步骤排查。
6. 升级dbt版本
某些旧版dbt存在--vars覆盖全局变量的bug,执行dbt --version查看版本,若版本低于1.0.0,建议升级到最新稳定版:
pip install --upgrade dbt-core dbt-snowflake # 根据你的数据库适配器调整
内容的提问来源于stack exchange,提问作者Bharat

