You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:33:00