【问题标题】:dbt & Jinja: How can I keep the raw string when setting a variable?dbt & Jinja:设置变量时如何保留原始字符串?
【发布时间】:2023-01-19 02:41:26
【问题描述】:

在 dbt 的宏中设置变量时如何保留原始文本?

我试过|e 但是当我登录查看时,它似乎不起作用。

我的宏代码:

{% macro process(column_name) %}
    {% set my_dict = {"\\T"|e:" ","\\\\T"|e:" "} %}
    {% for key, value in my_dict.items() %}
            {{ log(key, True) }}
    {% endfor %}
    {{ return('') }}
{% endmacro %}

日志输出是“\T”和“\\T”,我期待“\\T”和“\\\\T”。设置变量时,我正在寻找类似于 r'' 的内容。

【问题讨论】:

    标签: jinja2 dbt


    【解决方案1】:

    在 Python 中,原始字符串文字影响解释器如何解析您用引号引起来的字符。一旦进入内存,以原始字符串文字开始其生命的字符串与以普通字符串文字开始的字符串之间没有区别。在 Python 解释器中试试这个:

    >>> raw = r"T"
    >>> print(raw)
    T
    >>> raw
    '\T'
    >>> ordinary = "\T"
    >>> print(ordinary)
    T
    >>> ordinary
    '\T'
    

    正如您可能发现的那样,jinja 不解析原始字符串文字。它确实有一个 {% raw %} 标签,但那是为了转义 jinja 语法。 escape(或e)过滤器用于 HTML 转义(例如,它将用 %20 替换空格)并且不影响 Python 字符串文字解析。

    使用 {% set %} 块将执行您想要的操作,并且不会转义反斜杠:

    {% macro raw_string() %}
    {% set key -%}
    \T
    {%- endset %}
    {{ log(key, True) }}
    {% endmacro %}
    -- dbt run-operation raw_string
    -- \T
    

    但如果你有很多键要处理,那将是乏味的(你需要为每个键使用一个 set 块,然后你必须单独定义字典,使用你在每个集合中定义的变量堵塞)。

    最终,这对您来说是一个数据输入挑战。从这个角度来看,您可能只想创建一个有效的 JSON 或 YAML 字符串;最近版本的 dbt 在 jinja 上下文中包含 fromjsonfromyaml 方法。值得庆幸的是,YAML 可以在字典键中使用反斜杠,并且不会进行任何转义:

    {% macro process() %}
    
    {% set data -%}
    \T: val
    \\T: val
    {%- endset %}
    
    {% set my_dict = fromyaml(data) %}
    
    {% for key, value in my_dict.items() %}
        {{ log(key, True) }}
    {% endfor %}
    
    {% endmacro %}
    -- dbt run-operation process
    -- \T
    -- \\T
    

    【讨论】:

      【解决方案2】:

      值得庆幸的是,YAML 可以在字典键中使用反斜杠,并且不会执行 > 任何转义。

      是的,但对于列表中的数据它仍然如此。 我找不到避免它的方法。

      {% macro raw_string() %}
      {% set key -%}
      - ^(.+.|\b)
      {%- endset %}
      {{ log(key, True) }}
      {% endmacro %}
      -- dbt run-operation raw_string
      -- ['^(.+\.|\\b)']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-06
        • 2016-11-29
        • 1970-01-01
        • 1970-01-01
        • 2023-01-20
        • 2016-09-17
        • 2018-02-07
        相关资源
        最近更新 更多