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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:57:04