将带有引号的字符串作为变量传递给 dbt/Jinja

Pass string with quotes as variables to dbt/Jinja

提问人:Thomas L. 提问时间:6/28/2023 最后编辑:Thomas L. 更新时间:6/28/2023 访问量:852

问:

我尝试运行一些代码并移交一个包含引号的变量: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'}"

jinja2 引用 dbt

评论

1赞 Ouroborus 6/28/2023
通常,反斜杠 () 用于转义字符,而不是正斜杠 ()。\/
0赞 Thomas L. 6/28/2023
谢谢,但不幸的是没有帮助。

答:

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 的目的。我认为这是正确/更好的方法。