使用Python mysql.connector批量插入列表数据到SQL表报1064错误如何解决
问题原因分析
你遇到的1064语法报错以及逻辑问题有两个核心诱因:
- 循环逻辑错误:原代码
for i in id_list遍历得到的是id_list的元素值而非索引下标,若id_list元素不是从0开始的连续整数,直接用i作为下标访问列表必然会出现索引越界。 - SQL语法错误:直接将Python的列表索引语法写进了SQL字符串中,MySQL服务端无法识别
id_list[i]这类Python语法,直接抛出语法错误。
原有代码修复方案(逐条插入版本)
如果确实需要逐条插入数据(比如每行数据插入前需要做额外校验处理),可以按以下方式修正代码:
# 遍历下标而非元素 for idx in range(len(id_list)): # 用参数化占位符传递参数,不要直接拼接变量到SQL字符串 mycursor.execute( "INSERT INTO table_1 VALUES (%s, %s, %s)", (id_list[idx], name_list[idx], sport_list[idx]) ) # 事务提交,必须执行才会真正写入数据 mydb.commit()
最优实现方案(批量插入,无需逐条执行)
优先使用mysql.connector自带的executemany方法实现批量插入,性能比循环逐条插入高5~10倍,同时自动处理参数转义,避免SQL注入风险:
import mysql.connector # 数据库连接部分请替换为自己的配置 mydb = mysql.connector.connect( host="127.0.0.1", user="root", password="你的数据库密码", database="你的数据库名称" ) mycursor = mydb.cursor() # 建表语句增加IF NOT EXISTS判断避免重复建表报错 mycursor.execute("CREATE TABLE IF NOT EXISTS table_1(ID int, NAME varchar(25), SPORT varchar(15))") # 替换为自己的实际数据 id_list = [1, 2, 3] name_list = ["张三", "李四", "王五"] sport_list = ["篮球", "足球", "网球"] # 合并三个列表为批量插入需要的元组参数列表 insert_params = list(zip(id_list, name_list, sport_list)) # 批量执行插入 insert_sql = "INSERT INTO table_1 (ID, NAME, SPORT) VALUES (%s, %s, %s)" mycursor.executemany(insert_sql, insert_params) # 提交事务 mydb.commit() print(f"成功插入{mycursor.rowcount}条数据")
注意事项
- 所有涉及参数传递的SQL操作都要使用参数化占位符
%s,不要自行拼接SQL字符串,既可以避免语法错误,也能防范SQL注入漏洞。 - 如果单批插入数据量超过10万行,建议拆分参数列表分批插入,避免单次请求数据量过大导致连接超时。
- 插入、更新、删除类写操作完成后必须调用
mydb.commit()提交事务,否则修改不会同步到数据库中。
内容的提问来源于stack exchange,提问作者Sumit Vaz
相关产品推荐
相关产品推荐

