如何引用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
相关产品推荐
相关产品推荐

