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

CSV批量导入MySQL遇SQL语法错误:问题排查与修复

问题分析与解决:CSV数据插入MySQL的语法错误

问题根源

你看输出的SQL语句就明白问题在哪了——生成的INSERT语句里,列名部分是带方括号和引号的列表字符串(比如['date', 'site_id', ...]),这完全不符合MySQL的语法规范!MySQL要求列名是用逗号分隔的纯字段名,不能带列表的格式符号。

这是因为你代码里的csv_headers是一个列表对象,直接用字符串格式化把它拼进SQL里时,Python会把列表转换成它的默认字符串表示(就是带[]和单引号的样子),最终导致SQL语法错误。

修正方案

把列表格式的csv_headers转换成逗号分隔的字段名字符串,如果担心字段名和MySQL关键字冲突,还可以给每个字段名加上反引号(`)包裹,避免语法冲突。

修改后的代码

def upload_to_db(table, folder):
    print('Uploading...', end='')
    files = grab_files(folder)
    # Connect to dfeventlogger database
    connection = pymysql.connect(**eventlogger_config, charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
    try:
        with connection.cursor() as cursor:
            # Open each csv in the files list
            # and ignore column headers
            for file in files:
                csv_file = open_csv(file)
                csv_headers = csv_file[0]
                # 关键修改:把列表转成逗号分隔的字段名,可选加反引号包裹
                formatted_headers = ', '.join([f`{header}` for header in csv_headers])
                csv_data = csv_file[1:]
                # Insert each row of each csv into eventlogger table
                for row in csv_data:
                    placeholders = ', '.join(['%s'] * len(row))
                    # 这里改用处理好的formatted_headers
                    sql = "INSERT INTO %s ( %s ) VALUES ( %s )" % (table, formatted_headers, placeholders)
                    print(formatted_headers, '\n')
                    print(sql, '\n')
                    print(row)
                    cursor.execute(sql, row)
            # Connection is not autocommit by default.
            # So you must commit to save your changes.
            connection.commit()
    finally:
        connection.close()
    print('Finished')
upload_to_db('gsSearchAnalyticsTest', 'some_folder')

额外优化建议

  • 批量插入提升效率:现在是逐行插入,如果数据量很大,速度会很慢。可以改成批量插入,比如把多个row打包成一个列表,然后用executemany方法,减少数据库交互次数。
  • 异常捕获细化:可以在循环里增加异常捕获,避免单个行出错导致整个任务中断,还能记录错误行的信息方便排查。
  • 文件操作优化:如果open_csv是自己实现的函数,建议用csv模块的csv.reader来读取,更规范且能处理特殊格式的CSV(比如带引号的字段)。

内容的提问来源于stack exchange,提问作者AK91

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:11:15