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
相关产品推荐
相关产品推荐

