Python读取CSV写入MySQL出现ProgrammingError与AttributeError求助
报错原因及修复方案
错误1:ProgrammingError: Not all parameters were used in the SQL statement
原因:
- INSERT语句未指定插入列名,若
TestTable的字段顺序、字段数量和你传入的records字段不匹配,就会出现参数数量不对应的问题 - 读取的CSV单条记录字段数和SQL占位符数量(8个)不一致
修复方法:
- 补全INSERT语句的列名,确保和你筛选的
columns顺序完全对应 - 可提前校验每条记录的字段数量,避免CSV读取异常导致的字段数不符
错误2:AttributeError: 'MySQLCursor' object has no attribute 'rollback'
原因:rollback()是数据库连接对象的方法,不是游标对象的方法,如果你之前代码中误写为cursor.rollback()就会触发该报错。你当前贴出的代码中mydb.rollback()的写法是正确的,额外注意如果连接初始化失败时mydb未实例化,调用rollback也会异常,可以增加异常判断。
修正后完整代码
import mysql.connector as sql_db import pandas as pd df = pd.read_csv(r'C:\Users\xxx\Documents\Python Scripts\Databases\Testfiles\test.csv',sep=";") columns = ['Id', 'Name', 'Url', 'ImageUrl', 'MaxNumberOfRooms', 'MinNumberOfRooms', 'MaxArea', 'MaxPrice'] df_data = df[columns] records = df_data.values.tolist() # 提前校验字段数量 if len(records) >0 and len(records[0]) != 8: print(f"单条记录字段数异常,应为8,实际为{len(records[0])}") exit() mydb = None cursor = None try: mydb = sql_db.connect( host="127.0.0.1", user="Admin", password="AdminPassword", database="dbTest" ) # 补全列名的插入语句 sql_insert = """ INSERT INTO TestTable (Id, Name, Url, ImageUrl, MaxNumberOfRooms, MinNumberOfRooms, MaxArea, MaxPrice) VALUES (%s,%s,%s,%s,%s,%s,%s,%s) """ cursor = mydb.cursor() cursor.executemany(sql_insert,records) mydb.commit() print(f"成功插入{cursor.rowcount}条数据") except Exception as e: if mydb: mydb.rollback() print(f"操作失败:{str(e)}") finally: if cursor: cursor.close() if mydb: mydb.close()
其他注意事项
- 无需导入你代码中没用的pypyodbc、pyodbc、csv模块,避免不必要的命名冲突
- 可以在执行
executemany前先打印第一条record和sql语句,核对字段顺序是否和表结构匹配
内容的提问来源于stack exchange,提问作者NewDev
相关产品推荐
相关产品推荐

