嗨,我目前正在编写Jinja宏,它根据传递给它的一些参数运行一个sql查询。我对宏定义本身有一些问题。我无法找到在set块中使用宏参数的方法。它将值解释为字面上的“col1”,而不是存储在其中的值。
如何在使用参数存储值的宏中运行SQL查询?
如何运行宏:
WITH DRIVER
AS(
SELECT
'apple' as col1
)
SELECT
{{ select_test('col1') }} as output
FROM
DRIVER
宏定义如下:
{% 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
我的预期产出:苹果香蕉
注:为清晰起见进行编辑
发布于 2022-11-02 08:21:32
您非常接近--我认为您对这个查询的嵌套性质感到困惑。
我怀疑在创建这个示例时,您没有在原始查询中包含一组引号。如果col1banana
为双引号(无论是在宏中还是在模型中),此查询将返回col1
,否则将返回数据库错误:
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
最后一个示例总是数据库错误,因为它编译如下:
select
concat(col1, 'banana')
而且在您的from
中没有query_to_run
子句,所以col1
不存在。
大多数宏不使用run_query
,只是sql片段的快捷方式。然后,这些模板返回到模型查询中,并在构建模型时对数据库执行。
将字符串连接到列名上的宏非常简单:
{% macro cat_banana(column_name) %}
concat({{ column_name }}, 'banana')
{% endmacro %}
然后你从你的模特那里叫它:
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
。
https://stackoverflow.com/questions/74285105
复制相似问题