DBT Jinja宏:转换以数字开头的列名方案求优化
优化确保列名不以数字开头的DBT Jinja宏方案
原实现代码
以下是用于确保列名不以数字开头的DBT Jinja宏原实现:
{% macro valid_column_name (column_name) %} {% if column_name[:1]|int(-1) >= 0 %} {{ return("_" ~ column_name ) }} {% else %} {{ return( column_name ) }} {% endif %} {% endmacro %}
原调用方式示例:
select 22 as {{ valid_column_name('1') }}
优化方案及代码
原实现存在未处理列名前后空白、空字符串会引发索引错误、判断方式不够直观等问题,下面是优化后的版本:
优化版1(字符串方法判断)
{% macro valid_column_name(column_name) %} {% set trimmed_col = column_name | trim %} {% if trimmed_col and trimmed_col[0].isdigit() %} {{ return("_" ~ trimmed_col) }} {% else %} {{ return(trimmed_col) }} {% endif %} {% endmacro %}
优化版2(正则匹配)
如果需要支持全角数字等特殊场景,可改用正则匹配:
{% macro valid_column_name(column_name) %} {% set trimmed_col = column_name | trim %} {% if trimmed_col | regex_match('^\d') %} {{ return("_" ~ trimmed_col) }} {% else %} {{ return(trimmed_col) }} {% endif %} {% endmacro %}
优化说明
- 增加
trim处理:去除列名前后空白字符,避免因空格导致开头数字的误判(比如列名是" 123"的场景) - 空值保护:先判断处理后的列名非空,防止空字符串调用索引时出现错误
- 更直观的判断逻辑:
isdigit()方法或正则匹配比转int判断可读性更高,逻辑更清晰 - 兼容更多场景:正则版本可轻松扩展支持全角数字、特殊数字格式等情况
内容的提问来源于stack exchange,提问作者Josh Pachner
相关产品推荐
相关产品推荐

