如何在dbt的Ephemeral Model(临时模型)中动态传递变量?
在dbt中向临时模型动态传递变量的解决方案
可以向临时模型动态传递变量,但你当前使用模型config中vars的方式无法生效——模型级的vars仅作用于当前模型本身,不会自动传递给它引用的依赖模型(包括临时模型)。下面提供两种可行的实现方式:
方式一:通过带参数的ref传递变量
这种方法基于dbt的ref函数支持传递参数的特性,将变量直接注入到临时模型的上下文:
- 保持临时模型(比如命名为
ephemeral_table1_cte)的代码不变:
WITH table1_cte AS ( SELECT col1, col2, col3 FROM table1 WHERE filter_condition1 AND filter_condition2 AND filter_condition3 AND form_id = {{ var('form_id') }} QUALIFY ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col4) = 1 ) SELECT * FROM table1_cte
- 在
rs_model1中引用临时模型时,通过ref的第二个参数传递变量:
WITH table1_cte AS ( SELECT * FROM {{ ref('ephemeral_table1_cte', {'form_id': 123}) }} ) -- 这里编写rs_model1的后续业务逻辑
- 在
rs_model2中同理传递对应的值:
WITH table1_cte AS ( SELECT * FROM {{ ref('ephemeral_table1_cte', {'form_id': 111}) }} ) -- 这里编写rs_model2的后续业务逻辑
方式二:用宏封装可复用的CTE逻辑
如果不需要依赖临时模型,使用宏封装参数化的CTE代码会更直观灵活,也能彻底避免变量传递的上下文问题:
- 在dbt项目的
macros/目录下创建宏文件(比如macros/get_table1_cte.sql):
{% macro get_table1_cte(form_id) %} SELECT col1, col2, col3 FROM table1 WHERE filter_condition1 AND filter_condition2 AND filter_condition3 AND form_id = {{ form_id }} QUALIFY ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col4) = 1 {% endmacro %}
- 在
rs_model1中直接调用宏并传入参数:
WITH table1_cte AS ( {{ get_table1_cte(123) }} ) -- rs_model1的后续业务逻辑
- 在
rs_model2中调用宏传入对应值:
WITH table1_cte AS ( {{ get_table1_cte(111) }} ) -- rs_model2的后续业务逻辑
内容的提问来源于stack exchange,提问作者user375647
相关产品推荐
相关产品推荐

