dbt中如何移除Jinja字符串列表外层双引号保留内部单引号
问题原因
当前写法是把ref()调用逻辑做了字符串格式化,最终存入列表的是内容为ref('xxx')的字符串,而非ref()函数实际执行后的返回对象。Jinja打印列表时会自动给字符串类型的元素包裹外层双引号,这是列表序列化的默认规则,用strip()、replace()处理字符串本身解决不了根本问题。
解决方案
根据实际使用场景二选一即可:
场景1:后续需要调用ref返回的模型Relation对象(90%的dbt场景适用)
不要用字符串拼接ref语法,直接在循环内调用ref函数传参即可,存入列表的是真实的ref返回值,不会带多余的字符串引号:
{# 先初始化空列表,若代码中已经完成初始化可省略这行 #} {% set ref_format_results = [] %} {% for result in results_list %} {# 直接执行ref函数,不做字符串格式化包裹 #} {% do ref_format_results.append(ref(result)) %} {% endfor %} {% do log(ref_format_results, info=true) %}
场景2:仅需要日志打印出[ref('model_a'),ref('model_b'),ref('model_c')]格式的文本
如果不需要实际调用ref,只是要输出指定格式的文本,不要直接log整个列表,手动拼接输出字符串即可,绕过列表默认序列化的引号规则:
{% set output_text = ["["] %} {% for result in results_list %} {% do output_text.append("ref('" ~ result ~ "')") %} {% if not loop.last %} {% do output_text.append(",") %} {% endif %} {% endfor %} {% do output_text.append("]") %} {# 拼接成完整字符串后打印 #} {% do log(output_text|join(''), info=true) %}
无效尝试说明
之前用strip()、replace()处理字符串无法解决问题,核心原因有两点:
- 字符串格式化生成的
ref('xxx')只是纯文本内容,不是可执行的dbtref()函数调用,本身不具备ref的实际能力 - 直接打印Jinja列表时,自动给字符串类型元素包裹外层双引号是模板引擎的默认序列化规则,和字符串内部的内容无关
只要列表里存的是字符串类型、直接打印整个列表,就必然会出现外层双引号,修改字符串内容没法改变这个输出规则。
内容的提问来源于stack exchange,提问作者Mr. Jibz
相关产品推荐
相关产品推荐

