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

将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()
关键细节说明
  1. 参数格式转换:result[['id', 'first_name', 'last_name']].values提取出你需要插入的三列数据,再转成元组列表,每个元组正好对应SQL语句里的3个占位符。
  2. 事务提交:MySQL默认不会自动提交事务,所以插入完成后必须调用connection.commit(),否则所有操作都是临时的,断开连接后数据会丢失。
  3. 为什么用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:20:25