CMySQLCursor.execute()传参数量不符报错排查
问题根因定位
两个报错是同一个代码错误触发的,问题出在mycursor.execute()的参数传参格式:
CMySQLCursor.execute()方法的签名要求最多传入2个显式位置参数:第一个是SQL语句字符串,第二个是存储所有占位符匹配值的序列(元组/列表)或字典。你当前代码把3个待插入的值拆成了3个独立的位置参数传入,算上隐式绑定的self参数,总共给execute传了5个参数,直接触发参数数量不匹配的异常。- 「值数量不正确」是参数传错后的连带报错:驱动无法正确解析到待绑定的值序列,就会误判占位符和传入值的数量不匹配。
另外代码里还有两个需要注意的点:
- 现有代码用
?作为占位符,CMySQLCursor是MySQL官方驱动/PyMySQL的C实现游标,这类MySQL Python驱动的占位符是%s,不是?(?是pyodbc连接SQL Server等数据库用的占位符),参数格式修正后如果还报错,需要同步替换占位符。 - 游标初始化
mycursor = mydb.cursor()写在了for循环内部,每次遍历都会新建一个游标对象,浪费资源,移到循环外即可,该问题不会触发报错,但会影响运行性能。
修复后代码
# 游标初始化移到循环外,仅创建一次 mycursor = mydb.cursor() for row in word_cloud_data.itertuples(): mycursor.execute(''' INSERT INTO dbo.word_cloud (word, word_frequency, Results_file) VALUES (%s,%s,%s) ''', # 3个待插入值打包成一个元组,作为execute的第二个参数传入 (row.word, row.word_frequency, row.Results_file) ) # 所有插入操作执行完成后统一提交,注意变量名和你自己的数据库连接对象保持一致 mydb.commit() # 操作完成后记得关闭游标和连接释放资源 mycursor.close() mydb.close()
修复说明
修正后execute()仅接收2个显式参数,符合方法签名要求;值元组内的3个元素和SQL里的3个占位符一一对应,不会再触发值数量不匹配的报错。如果你的实际业务场景是批量插入大量数据,还可以用executemany()替代循环逐行插入,性能会有明显提升。
内容的提问来源于stack exchange,提问作者savi
相关产品推荐
相关产品推荐

