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

如何引用dbt_project.yml中定义的变量?

dbt_project.yml变量在seeds/snapshots/tests配置中的正确引用方法

问题场景

在dbt_project.yml中定义了变量后,尝试在seeds、snapshots、tests的配置节点引用时遇到两种错误:

  • 使用var.clean时,dbt会把它识别为字符串,导致数据库尝试访问名为"var.clean"的不存在对象
  • 使用"{{var('clean')}}"时,会提示变量未找到,仅on-run-start中的变量引用能正常工作

原配置代码:

name: "snowflake_dwh"
version: "1.0.0"
config-version: 2

profile: "default"

vars:
  test_results_schema: dbt_test_history
  clean: "{% if target.name == 'prod' %} CLEAN {% else %} {{ target.database }} {% endif %}"
  custom: "{% if target.name == 'prod' %} CUSTOM {% else %} {{ target.database }} {% endif %}"
  test_schema: "{% if target.name == 'prod' %} DBT_TEST_RESULTS {% else %} DBT2_TEST_RESULTS {% endif %}"

seeds:
  data:
  +database: var.clean # -----> 无效
  +schema: seed_data
  +full_refresh: true

snapshots:
  +target_schema: dbt_snapshots
  +target_database: var.clean # -----> 无效

tests:
  snowflake_dwh:
    clean:
      +database: var.clean # -----> 无效
    custom:
      +database: var.custom # -----> 无效
  +store_failures: true
  +schema: dbt_test_results

on-run-start:
  - '{{ remove_empty_tables(var("clean"), var("test_schema")) }}' # -----> 有效

错误信息

运行时错误

Runtime Error
  Database error while listing schemas in database "var.clean"
  Database Error
    002043 (02000): SQL compilation error:
    Object does not exist, or operation cannot be performed.

编译时错误

Compilation Error
  Could not render {{var('clean')}}: Required var 'clean' not found in config:
  Vars supplied to <Configuration> = {}

解决方案

dbt在配置节点(如seeds、snapshots、tests的+database/+schema)中引用变量,直接使用不带引号的Jinja模板语法即可,不需要给{{ var('xxx') }}加引号。

修改后的正确配置示例:

seeds:
  data:
  +database: {{ var('clean') }} # 正确引用
  +schema: seed_data
  +full_refresh: true

snapshots:
  +target_schema: dbt_snapshots
  +target_database: {{ var('clean') }} # 正确引用

tests:
  snowflake_dwh:
    clean:
      +database: {{ var('clean') }} # 正确引用
    custom:
      +database: {{ var('custom') }} # 正确引用
  +store_failures: true
  +schema: dbt_test_results

核心说明

  • 配置节点中的Jinja模板不需要引号包裹,dbt会自动解析模板内容
  • var('var_name')是dbt中标准的变量引用方式,var.clean这种Python风格的属性访问在配置中不适用
  • 变量定义里的Jinja逻辑(比如根据target切换值)会正常生效,dbt会先解析变量本身的模板,再代入配置中使用

内容的提问来源于stack exchange,提问作者mcansado

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:22:49