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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:01:36