将pickle文件导入MySQL时出现ProgrammingError错误的求助
问题原因
你触发错误的核心问题是SQL参数和占位符完全不匹配:
- 你的INSERT语句需要3个参数(对应id、first_name、last_name三个字段),但你把整个Pandas DataFrame对象当成单个参数传给了
cursor.execute,相当于只给了1个参数,和3个%s占位符数量对不上,才会报not enough arguments for format string。
修正方案
因为你要插入的是多条记录,推荐用executemany批量插入,效率远高于循环单条插入。以下是完整修正代码:
import _pickle as cPickle import pandas as pd import MySQLdb csv_file = 'NEW_DIRECTORS.csv' filename = "myfile.pickle" # 保存数据到pickle(这部分无需修改) df = pd.read_csv(csv_file) with open(filename,'wb') as file_handle: cPickle.dump(df, file_handle) # 读取pickle中的DataFrame数据 with open(filename,'rb') as file_handle: result = cPickle.load(file_handle) # 数据库操作修正 connection = MySQLdb.connect('localhost','root','','movies') cursor = connection.cursor() # 将DataFrame转换为批量插入需要的格式:每条记录是(id, first_name, last_name)的元组 insert_data = [tuple(row) for row in result[['id', 'first_name', 'last_name']].values] # 批量插入数据 cursor.executemany("INSERT INTO `directors`(`id`, `first_name`, `last_name`) VALUES (%s,%s,%s)", insert_data) # 提交事务(必须执行,否则数据不会写入数据库) connection.commit() # 关闭连接资源 cursor.close() connection.close()
关键细节说明
- 参数格式转换:
result[['id', 'first_name', 'last_name']].values提取出你需要插入的三列数据,再转成元组列表,每个元组正好对应SQL语句里的3个占位符。 - 事务提交:MySQL默认不会自动提交事务,所以插入完成后必须调用
connection.commit(),否则所有操作都是临时的,断开连接后数据会丢失。 - 为什么用executemany:如果用循环调用
execute插入每条数据,会频繁和数据库建立交互,效率极低,批量插入能大幅提升速度。
备选:单条循环插入(不推荐)
如果一定要用execute单条插入,可以遍历DataFrame的每一行:
for _, row in result.iterrows(): cursor.execute( "INSERT INTO `directors`(`id`, `first_name`, `last_name`) VALUES (%s,%s,%s)", (row['id'], row['first_name'], row['last_name']) ) connection.commit()
内容的提问来源于stack exchange,提问作者Vagner
相关产品推荐
相关产品推荐

