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

Python批量插入报TypeError:并非所有参数都在字符串格式化时转换

嘿,我帮你找出问题所在了,你的代码里有两个关键错误导致了这个TypeError:

错误点解析

  1. 占位符用错了
    pymysql不支持用?作为参数占位符,它遵循MySQL的字符串格式化规则,得用%s来标记每个参数的位置。你现在用?的话,驱动没办法把你的列表数据正确转换成SQL里的参数。

  2. INSERT语句的字段名语法有问题
    你写的字段部分('id,'name',...)有个低级语法错误:第一个id的单引号没闭合('id,应该改成`id`,或者直接id,)。而且MySQL里字段名如果要加引号的话,得用反引号(`),单引号是用来包字符串值的,不能用来包字段名。


修正后的批量插入代码

给你改好的完整代码,直接用就行:

import pymysql
from decimal import Decimal
import datetime

# 替换成你的实际连接信息
cnx = pymysql.connect(host='xx', user='xx', password='xx', database='xx', autocommit=True)
cursor = cnx.cursor()

# 修正SQL:用%s占位符,字段名用反引号(非关键字字段可以省略反引号)
query = """INSERT INTO `tableA`(`id`, `name`, ...) 
           VALUES(%s, %s, ...)"""

# 你的listTosave数据格式是对的,不用改
listTosave = [
    ['AS0001', '1170', 1, '1', 'Unknown', 442, 1, 
     datetime.datetime(2018, 5, 28, 23, 0), 
     datetime.datetime(2018, 3, 15, 11, 15), 
     datetime.datetime(2018, 3, 15, 10, 56), 
     datetime.datetime(2018, 5, 28, 23, 18, 26), 
     datetime.datetime(2018, 5, 28, 23, 59, 22), 
     Decimal('15177.3184'), Decimal('15185.7562'), Decimal('8.4378')],
    # 其他数据行...
]

try:
    cursor.executemany(query, listTosave)
    print(f"搞定!成功插入{cursor.rowcount}条数据")
except Exception as e:
    print(f"插入失败啦:{str(e)}")
finally:
    # 好习惯:用完记得关游标和连接
    cursor.close()
    cnx.close()

额外提醒

  • 一定要保证VALUES里的%s数量和listTosave每个子列表的元素数完全对应,多一个少一个都会报错。
  • 如果你的字段名是MySQL的关键字(比如date、user),必须用反引号包起来,不然会触发语法错误。
  • 如果插入的数据量特别大,建议关闭autocommit=True,手动控制事务:插入完所有数据后调用cnx.commit(),这样能提升插入性能,减少数据库的IO开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:07:49