dbt模型中通过变量引用源表名的正确方法
解决dbt中用变量引用源表名的问题
这个问题我之前踩过类似的坑,核心是你误用了dbt的模板语法嵌套——在source()函数里额外套了一层{{ ... }},导致dbt把变量表达式当成了字符串字面量去解析,自然找不到对应的源。
正确的写法
直接把var('deva')作为source()的第一个参数传入就行,不需要再加模板标记:
select * from {{ source(var('deva'), 'table_name') }}
为什么原来的写法会报错?
当你写{{ source("{{ var('deva')}}", 'table_name') }}时,dbt处理模板的逻辑是:先解析外层的{{ ... }},但内层的{{ var('deva') }}会被当成普通字符串,而不是执行变量替换。最终dbt会尝试去查找名为{{ var('deva') }}的源定义(也就是你有没有在dbt_project.yml或sources.yml里声明这个名字的源),显然你没有,所以才会弹出那个找不到source的错误。
小验证技巧
写完之后可以跑dbt compile命令,然后去target/compiled目录下查看生成的SQL文件,确认变量是不是已经正确替换成了CEMD_RAW,这样能快速确认写法没问题。
内容的提问来源于stack exchange,提问作者swapna
相关产品推荐
相关产品推荐

