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

Python executemany批量插入MySQL报参数未全部使用错误排查

报错根因

你对executemany()的参数格式理解完全错误。
executemany()的第二个参数要求是序列,序列里的每个元素必须是和SQL中占位符数量一一对应的元组/列表,而不是你现在提前拼接好的、带括号和引号的整段值字符串。
你当前传入的val列表里每个元素都是单个字符串,相当于每次执行SQL时只传入了1个参数,但你的SQL语句里写了11个%s占位符,驱动找不到剩下10个占位符对应的参数,自然会抛出"Not all parameters were used in the SQL statement"错误。
另外你手动用format拼接SQL字符串的写法有严重安全隐患,会导致SQL注入风险,还会碰到特殊字符(比如值里带单引号)转义失败触发SQL语法错误的问题,完全不推荐。

修复代码

不需要自己给值加引号、拼括号,直接把每条记录的字段值按顺序组成元组存入列表即可,MySQL驱动会自动完成参数绑定、类型转换、特殊字符转义的工作。修正后的代码如下:

val = []
insert_sql = """INSERT INTO equipment (ItemStaticID, ItemID, ItemType, Element, Tier, Level, Hp, Atk, Hit, Def, Spd) 
                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"""
for item in test:
    # 按字段顺序组装元组即可,不要手动拼字符串
    single_record = (
        item.id,
        item.itemId,
        item.itemSubType,
        item.elementalType,
        item.grade,
        item.level,
        item.hP,
        item.aTK,
        item.hIT,
        item.dEF,
        item.sPD
    )
    val.append(single_record)

cursor = mydb.cursor()
cursor.executemany(insert_sql, val)
mydb.commit() # 执行后必须提交事务,否则数据不会实际写入数据库
补充建议
  • 你参考的官方示例里,records_to_insert存储的就是元组类型的记录,这才是参数化批量插入的标准写法,不要自己额外做字符串格式化
  • 如果数据量超过10万条,建议分批次调用executemany()(比如每1000~5000条提交一次),避免单批次数据量过大超出MySQL的max_allowed_packet限制,也能减少内存占用
  • 批量操作完成后必须调用commit()提交事务,否则所有插入操作都会被回滚,数据不会实际写入表中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:18:24