如何对齐SQL INSERT语句中的列名与对应值?
实现SQL INSERT语句列名与值对齐的方法
当然可以!把批量INSERT语句里的列名和对应值对齐确实能让可读性飙升,尤其是数据量多的时候。先给你看看对齐后的目标效果:
INSERT INTO KeyValue (id , key , value ) VALUES (101 , 'color', 'green'); INSERT INTO KeyValue (id , key , value ) VALUES (102 , 'color', 'green'); INSERT INTO KeyValue (id , key , value ) VALUES (103 , 'color', 'green');
下面给你推荐几种不同场景下的实现方法:
1. 专用SQL格式化工具(最省心)
如果是日常开发,直接用带SQL格式化功能的工具最方便:
- IDE类:DataGrip、DBeaver、PyCharm等都自带SQL格式化功能,在设置里找到「SQL格式化规则」,开启「列与值对齐」相关选项,选中代码一键格式化即可。
- 编辑器插件:VS Code可以安装「SQL Formatter」或「Prettier - SQL」插件,配置对齐规则后,用快捷键就能完成格式化。
2. Python脚本自定义对齐(适合批量处理)
如果需要自动化处理大量SQL语句,可以写个简单的Python脚本,自动计算每列的最大宽度并对齐:
import re # 原始SQL语句 raw_sql = """INSERT INTO KeyValue (id, key, value) VALUES (101, 'color', 'green'); INSERT INTO KeyValue (id, key, value) VALUES (102, 'color', 'green'); INSERT INTO KeyValue (id, key, value) VALUES (103, 'color', 'green');""" # 拆分单个INSERT语句 insert_stmts = [stmt.strip() for stmt in raw_sql.split(';') if stmt.strip()] # 从第一个语句提取列名 col_match = re.search(r'\((.*?)\)', insert_stmts[0].split('VALUES')[0]) columns = [col.strip() for col in col_match.group(1).split(',')] # 提取所有行的值 value_rows = [] for stmt in insert_stmts: val_match = re.search(r'VALUES\s*\((.*?)\)', stmt) values = [val.strip() for val in val_match.group(1).split(',')] value_rows.append(values) # 计算每列的最大宽度(列名+对应值的最长长度) col_widths = [] for idx, col in enumerate(columns): max_len = len(col) for row in value_rows: if len(row[idx]) > max_len: max_len = len(row[idx]) col_widths.append(max_len) # 生成格式化后的SQL formatted_stmts = [] for row in value_rows: # 格式化列名部分 formatted_cols = ', '.join([f"{col:<{col_widths[idx]}}" for idx, col in enumerate(columns)]) # 格式化值部分 formatted_vals = ', '.join([f"{val:<{col_widths[idx]}}" for idx, val in enumerate(row)]) formatted_stmts.append(f"INSERT INTO KeyValue ({formatted_cols}) VALUES ({formatted_vals});") # 输出结果 print('\n'.join(formatted_stmts))
运行后会直接输出对齐好的SQL语句,适合处理大量重复的INSERT语句。
3. 正则+文本编辑器(快速手动处理)
如果只是少量语句,用文本编辑器的正则替换+多光标功能就能快速搞定:
- 先把所有INSERT拆成单独一行:在VS Code中查找
; INSERT,替换为;\nINSERT。 - 对齐值部分:查找
VALUES \((\d+), ('[^']+'), ('[^']+')\),替换为VALUES ($1 , $2 , $3)(根据实际长度调整空格数)。 - 也可以用多光标选中所有列名和对应值的位置,手动添加空格对齐,效率也很高。
4. Shell工具组合(终端环境处理)
如果在Linux/macOS终端下,可以用awk+tr组合实现对齐:
echo "INSERT INTO KeyValue (id, key, value) VALUES (101, 'color', 'green'); INSERT INTO KeyValue (id, key, value) VALUES (102, 'color', 'green'); INSERT INTO KeyValue (id, key, value) VALUES (103, 'color', 'green');" | tr ';' '\n' | awk ' BEGIN { # 定义列名和对应宽度(可根据实际调整) split("id,key,value", cols, ",") widths[1] = length(cols[1]) + 1 widths[2] = length(cols[2]) + 2 widths[3] = length(cols[3]) + 1 } /INSERT/ { match($0, /VALUES \((.*?)\)/, vals) split(vals[1], values, ",") # 格式化输出 printf "INSERT INTO KeyValue (%-" widths[1] "s, %-" widths[2] "s, %-" widths[3] "s) VALUES (%-" widths[1] "s, %-" widths[2] "s, %-" widths[3] "s);\n", cols[1], cols[2], cols[3], values[1], values[2], values[3] } '
执行后会在终端输出对齐后的SQL语句。
内容的提问来源于stack exchange,提问作者polapts
相关产品推荐
相关产品推荐

