如何在dbt的post hook Jinja宏中正确输出单引号?
dbt Post Hook生成SQL缺失单引号问题
现有配置
dbt模型post hook配置
{{ config( post_hook=[ '{{ execute_if_exists("delete from " ~ this ~ " where day = date('' " ~ var("mydatevar") ~ " '')") }}', ] ) }}
注:配置中尝试用''转义单引号
宏定义
{% macro execute_if_exists(query) -%} {{ query }} {%- endmacro %}
问题现象
- 实际生成SQL(缺失单引号):
delete from catalog.myschema.mytable where day = date( 2024-10-02 )
- 期望生成SQL(带单引号):
delete from catalog.myschema.mytable where day = date(' 2024-10-02 ')
已尝试的无效写法
- 写法1:触发编译错误
'{{ execute_if_exists("delete from " ~ this ~ " where day = date(' " ~ var("mydatevar") ~ " ')") }}'
- 写法2:生成SQL仍无单引号
"{{ execute_if_exists('delete from ' ~ this ~ ' where day = date(' ' ~ var('mydatevar') ~ ' ')') }}"
- 写法3:触发编译错误
"{{ execute_if_exists('delete from ' ~ this ~ ' where day = date(' ' ~ var('mydatevar') ~ ' ')') }}"
正确配置方案
调整post hook的字符串拼接逻辑,使用Jinja正确的单引号转义方式:
方案一
{{ config( post_hook=[ "{{ execute_if_exists('delete from ' ~ this ~ ' where day = date(\'' ~ var('mydatevar') ~ '\')') }}" ] ) }}
方案二
{{ config( post_hook=[ '{{ execute_if_exists("delete from " ~ this ~ " where day = date(\'" ~ var("mydatevar") ~ "\')") }}' ] ) }}
逻辑说明
- 在Jinja字符串中,单引号包裹的内容里,内部单引号需用
\'转义;双引号包裹的内容里可直接使用单引号 - 确保变量
var('mydatevar')被正确解析后,单引号作为SQL字符串的一部分被拼接进最终语句
内容的提问来源于stack exchange,提问作者Cherry
相关产品推荐
相关产品推荐

