Pandas遍历DataFrame向数据库插入数据时VALUES子句报错如何解决
问题修复方案
现有代码错误原因
- INSERT语句的VALUES参数段存在语法错误:
curr[2]前多写了半个方括号[,且整体括号没有正确配对 - 取数逻辑冗余且容易出错:单独维护
count变量没有必要,且如果DataFrame索引不连续,用loc取数会触发索引不存在报错 %sql魔术命令无法直接识别Python上下文里的curr变量,需要按规则传入参数
修复后的代码
循环插入版本(适配原有写法逻辑)
for i in range(len(gelsdf)): # 用iloc按行位置取值,规避索引不连续问题 curr = gelsdf.iloc[i] # 按ipython-sql的传参规则传入变量,不同数据库驱动占位符可替换为%s等对应格式 %sql INSERT INTO Gels (GelID, Brand, GelCode, Size, GelName, GelLocation) VALUES (:1, :2, :3, :4, :5, :6), curr[0], curr[1], curr[2], curr[3], curr[4], curr[5]
更推荐的批量插入版本(无需手动写循环,性能更高)
from sqlalchemy import create_engine # 替换为对应数据库的连接字符串 engine = create_engine('mysql+pymysql://user:password@host:port/dbname') # 直接调用pandas内置方法批量写入,if_exists设为append是追加数据,index=False表示不把DataFrame索引写入表 gelsdf.to_sql(name='Gels', con=engine, if_exists='append', index=False)
额外注意事项
- 若Gels表的GelID字段是自增主键,无需手动插入,删除INSERT语句中的GelID字段和对应第一个值即可
- 需提前确认gelsdf各列的数据类型与Gels表的字段类型一一匹配,避免触发类型不匹配报错
内容的提问来源于stack exchange,提问作者A. T.
相关产品推荐
相关产品推荐

