提问人:Thomas L. 提问时间:6/28/2023 最后编辑:Thomas L. 更新时间:6/28/2023 访问量:852
将带有引号的字符串作为变量传递给 dbt/Jinja
Pass string with quotes as variables to dbt/Jinja
问:
我尝试运行一些代码并移交一个包含引号的变量:dbt
SELECT
field_1,
field_2
FROM
{{ source('schema', 'table') }}
WHERE
region IN ({{ var("regions") }}) -- ( 'NY', 'WA' )
这是我调用它的命令:
dbt compile -s model --vars '{"regions": "'NY', 'WA'"}'
但它总是被编译为此,并且引号被剥离:
region IN ( NY, WA )
我试图使用或使用括号来逃避它.但无法让它工作。"/'NY/', /'WA/'"
"{'NY', 'WA'}"
答:
2赞
Adam Kipnis
6/28/2023
#1
我建议稍微改变你的输入,以传入数组并构建 in 列表。
{%- macro build_in_list(fields, prefix='', postfix='') -%}
(
{%- for element in fields -%}
{%- if element is number -%}
{{ element }}
{%- else -%}
{%- set element = prefix ~ element ~ postfix -%}
'{{ element }}'
{%- endif -%}
{%- if not loop.last -%} , {%- endif -%}
{%- endfor -%}
)
{%- endmacro -%}
然后在模型中用
SELECT
field_1,
field_2
FROM
{{ source('schema', 'table') }}
WHERE
region IN {{ build_in_list(fields=var('regions', [])) }} -- ( 'NY', 'WA' )
最后,使用
dbt compile -s model --vars '{"regions": ["NY", "WA"]}'
如果你只需要一个在 in 列表之外的简单引号输入,你可以使用一个更简单的版本:
{%- macro quoted_var(field) -%}
'{{ var(field) }}'
{%- endmacro -%}
评论
0赞
Thomas L.
6/30/2023
谢谢,我想这会起作用。但真的没有办法逃脱引号吗?
0赞
Adam Kipnis
6/30/2023
我不这么认为。但你为什么要这样做呢?您正在将 SQL 语法与 JSON 混合使用。将你的 JSON 保留为纯 JSON,并使用 Jinja 生成 SQL,这就是 DBT 的目的。我认为这是正确/更好的方法。
评论
\
/