Jinja宏中如何在执行SQL的set块内正确访问宏参数?
问题解决:Jinja宏参数被识别为字面量而非实际列值
你的问题根源在于:宏内部的run_query是独立执行的查询,无法访问外层SQL中的WITH DRIVER上下文,且你传入的val1是字符串'col1',导致run_query执行的SQL把col1当成字面量处理,而非引用DRIVER表的列值。
以下是两种针对性解决方案,可根据你的需求选择:
方案1:让宏能访问数据源(适合Jinja渲染阶段提前计算结果的场景)
修改宏,新增数据源查询参数,让run_query能完整执行包含数据源的SQL:
{% macro select_test(val1, source_query) %} {% set query_to_run%} WITH data AS ({{ source_query }}) SELECT concat({{val1}}, 'banana') FROM data {% endset %} {% set results = run_query(query_to_run) %} {% if execute %} {% set results_list = results.columns[0].values() %} {% else %} {% set results_list = [] %} {% endif %} {{ return(results_list[0] if results_list else '') }} {% endmacro %}
调用时传入DRIVER的查询语句:
WITH DRIVER AS( SELECT 'apple' as col1 ) SELECT {{ select_test('col1', 'SELECT * FROM DRIVER') }} as output FROM DRIVER
方案2:直接生成SQL表达式(适合最终SQL执行时计算的场景)
如果不需要在Jinja阶段提前获取结果,仅需生成concat逻辑的SQL,简化宏即可:
{% macro select_test(val1) %} concat({{val1}}, 'banana') {% endmacro %}
调用方式不变,最终生成的SQL会自动引用DRIVER表的col1列,执行后得到期望的applebanana。
内容的提问来源于stack exchange,提问作者Lander Carlson
相关产品推荐
相关产品推荐

