Python批量插入报TypeError:并非所有参数都在字符串格式化时转换
嘿,我帮你找出问题所在了,你的代码里有两个关键错误导致了这个TypeError:
错误点解析
占位符用错了
pymysql不支持用?作为参数占位符,它遵循MySQL的字符串格式化规则,得用%s来标记每个参数的位置。你现在用?的话,驱动没办法把你的列表数据正确转换成SQL里的参数。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
相关产品推荐
相关产品推荐

