如何使用for循环缩短Python代码中的SQL插入查询语句
如何精简冗余的SQL INSERT拼接代码
问题
当前编写的生成SQL插入语句的代码存在大量重复逻辑,逐行手动编写字段和取值的方式过于冗长,需要通过循环重构精简代码。
现有代码如下:
def writeFile(fileName, tableName): sig = sd.SignalData("../raw_data/" + fileName) sql_file = tableName + ".sql" f = open(sql_file, "w") f.write(createTable) lines = [] for i in range(len(sig.IMU.Lshank.time)): lshank_accel_x = sig.IMU.Lshank.a[i][0] lshank_accel_y = sig.IMU.Lshank.a[i][1] lshank_accel_z = sig.IMU.Lshank.a[i][2] lshank_gyro_x = sig.IMU.Lshank.w[i][0] lshank_gyro_y = sig.IMU.Lshank.w[i][1] lshank_gyro_z = sig.IMU.Lshank.w[i][2] lshank_mag_x = sig.IMU.Lshank.m[i][0] lshank_mag_y = sig.IMU.Lshank.m[i][1] lshank_mag_z = sig.IMU.Lshank.m[i][2] insert_query = f"INSERT INTO {tableName} (lshank_time,lshank_accel_x, lshank_accel_y, lshank_accel_z,lshank_gyro_x, lshank_gyro_y, lshank_gyro_z,lshank_mag_x, lshank_mag_y, lshank_mag_z) VALUES ({sig.IMU.Lshank.time[i]}, {lshank_accel_x}, {lshank_accel_y}, {lshank_accel_z}, {lshank_gyro_x}, {lshank_gyro_y}, {lshank_gyro_z}, {lshank_mag_x}, {lshank_mag_y}, {lshank_mag_z});\n" lines.append(insert_query) for i in range(len(sig.IMU.Rshank.time)): rshank_accel_x = sig.IMU.Rshank.a[i][0] rshank_accel_y = sig.IMU.Rshank.a[i][1] rshank_accel_z = sig.IMU.Rshank.a[i][2] rshank_gyro_x = sig.IMU.Rshank.w[i][0] rshank_gyro_y = sig.IMU.Rshank.w[i][1] rshank_gyro_z = sig.IMU.Rshank.w[i][2] rshank_mag_x = sig.IMU.Rshank.m[i][0] rshank_mag_y = sig.IMU.Rshank.m[i][1] rshank_mag_z = sig.IMU.Rshank.m[i][2] insert_query = f"INSERT INTO {tableName} (rshank_time,rshank_accel_x,rshank_accel_y,rshank_accel_z,rshank_gyro_x,rshank_gyro_y,rshank_gyro_z,rshank_mag_x,rshank_mag_y,rshank_mag_z) VALUES ({sig.IMU.Rshank.time[i]},{rshank_accel_x}, {rshank_accel_y}, {rshank_accel_z},{rshank_gyro_x},{rshank_gyro_y},{rshank_gyro_z},{rshank_mag_x},{rshank_mag_y},{rshank_mag_z});\n" lines.append(insert_query)
解决方案
代码冗余的核心原因是左右腿的处理逻辑完全一致,且每个传感器三个轴的取值、字段拼接也都是重复劳动,通过配置+循环即可消除所有重复代码,重构后代码如下:
def writeFile(fileName, tableName): sig = sd.SignalData("../raw_data/" + fileName) sql_file = tableName + ".sql" f = open(sql_file, "w") f.write(createTable) lines = [] # 配置待处理的IMU部位:(字段前缀, 对应IMU数据对象) imu_parts = [ ("lshank", sig.IMU.Lshank), ("rshank", sig.IMU.Rshank) ] # 配置传感器类型:(字段后缀, 对象属性名) sensors = [ ("accel", "a"), ("gyro", "w"), ("mag", "m") ] axes = ["x", "y", "z"] for col_prefix, part_data in imu_parts: # 遍历当前部位所有采样点 for sample_idx in range(len(part_data.time)): columns = [f"{col_prefix}_time"] values = [str(part_data.time[sample_idx])] # 拼接三类传感器的字段和值 for sensor_suffix, attr_name in sensors: # 追加xyz三个轴的字段名 columns.extend([f"{col_prefix}_{sensor_suffix}_{axis}" for axis in axes]) # 追加xyz三个轴的采样值 sensor_data = getattr(part_data, attr_name)[sample_idx] values.extend([str(val) for val in sensor_data]) # 拼接最终SQL语句 insert_query = f"INSERT INTO {tableName} ({','.join(columns)}) VALUES ({','.join(values)});\n" lines.append(insert_query) # 补充原代码缺失的写入、关闭文件逻辑 f.writelines(lines) f.close()
重构收益
- 重复代码完全消除:不需要逐行定义9个单轴变量、手动拼接10个字段和10个值,代码量压缩60%以上
- 可维护性大幅提升:后续如果需要新增其他IMU采集部位(比如大腿、腰部),只需要在
imu_parts列表中新增配置项即可,不需要重写整段插入逻辑;如果需要调整字段命名,也只需要修改配置部分 - 修复了原代码的逻辑漏洞:原代码只写入了建表语句,没有把攒在
lines列表里的插入语句写入文件,也没有关闭文件句柄,重构后补全了这部分逻辑
内容的提问来源于stack exchange,提问作者QZ Zhang
相关产品推荐
相关产品推荐

