首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Jinja中,如何在运行SQL的set块中访问宏参数?

在Jinja中,如何在运行SQL的set块中访问宏参数?
EN

Stack Overflow用户
提问于 2022-11-02 06:22:27
回答 1查看 38关注 0票数 0

嗨,我目前正在编写Jinja宏,它根据传递给它的一些参数运行一个sql查询。我对宏定义本身有一些问题。我无法找到在set块中使用宏参数的方法。它将值解释为字面上的“col1”,而不是存储在其中的值。

如何在使用参数存储值的宏中运行SQL查询?

如何运行宏:

代码语言:javascript
运行
复制
WITH DRIVER 
AS(
    SELECT
    'apple' as col1
)

SELECT
    {{ select_test('col1') }} as output
FROM
    DRIVER

宏定义如下:

代码语言:javascript
运行
复制
{% macro select_test(val1) %}

    {% set query_to_run%}
        select
         concat({{val1}},'banana')
    {% endset %}

    {% set results = run_query(query_to_run) %}

    {% if execute %}
    {# Return the first column #}
    {% set results_list = results.columns[0].values() %}
    {% else %}
    {% set results_list = [] %}
    {% endif %}

    {{ return(results_list) }}

{% endmacro %}

我目前得到以下输出: col1banana

我的预期产出:苹果香蕉

注:为清晰起见进行编辑

EN

回答 1

Stack Overflow用户

发布于 2022-11-02 16:21:32

您非常接近--我认为您对这个查询的嵌套性质感到困惑。

我怀疑在创建这个示例时,您没有在原始查询中包含一组引号。如果col1banana为双引号(无论是在宏中还是在模型中),此查询将返回col1,否则将返回数据库错误:

代码语言:javascript
运行
复制
select
    concat('{{ val1 }}','banana')
-- {{ select_test('col1') }} returns 'col1banana'

select
    concat({{ val1 }}, 'banana')
-- {{ select_test("'col1'") }} returns 'col1banana'

select
    concat({{ val1 }}, 'banana')
-- {{ select_test('col1') }} raises a Database Error: column "col1" does not exist

最后一个示例总是数据库错误,因为它编译如下:

代码语言:javascript
运行
复制
select
    concat(col1, 'banana')

而且在您的from中没有query_to_run子句,所以col1不存在。

大多数宏不使用run_query,只是sql片段的快捷方式。然后,这些模板返回到模型查询中,并在构建模型时对数据库执行。

将字符串连接到列名上的宏非常简单:

代码语言:javascript
运行
复制
{% macro cat_banana(column_name) %}
concat({{ column_name }}, 'banana')
{% endmacro %}

然后你从你的模特那里叫它:

代码语言:javascript
运行
复制
WITH DRIVER 
AS(
    SELECT
    'apple' as col1
)

SELECT
    {{ cat_banana('col1') }} as output
FROM
    DRIVER

然后在dbt run -s my_model之后,如果你select * from my_model,你会得到applebanana

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74285105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档