dbt宏中设置变量时如何保留原始字符串?
在dbt宏中保留原始文本(实现类似Python原始字符串效果)
首先要明确:你用的|e过滤器是HTML转义过滤器,只负责处理<、>、&、"这类HTML特殊字符,对反斜杠的转义完全不起作用,这就是它没生效的原因。
要在dbt的Jinja2模板里实现类似Pythonr''原始字符串的效果,有两种靠谱的方式:
方法一:使用raw块包裹原始字符串
Jinja2的raw块会直接保留内部的所有文本,不做任何转义解析,适合需要完全原始内容的场景:
{% macro process(column_name) %} {% set my_dict = {} %} {% raw %} {% set key1 = "\\T" %} {% set key2 = "\\\\T" %} {% endraw %} {% do my_dict.update({key1: " ", key2: " "}) %} {% for key, value in my_dict.items() %} {{ log(key, True) }} {% endfor %} {{ return('') }} {% endmacro %}
方法二:手动双重转义反斜杠
Jinja2会自动解析字符串里的转义字符(和Python类似),所以要得到1个实际的反斜杠,需要写2个反斜杠;要得到2个实际的反斜杠,就得写4个:
{% macro process(column_name) %} {% set my_dict = {"\\\\T": " ", "\\\\\\\\T": " "} %} {% for key, value in my_dict.items() %} {{ log(key, True) }} {% endfor %} {{ return('') }} {% endmacro %}
两种方法运行后,日志都会输出你期望的\\T和\\\\T。
内容的提问来源于stack exchange,提问作者Calum
相关产品推荐
相关产品推荐

