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

