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

Python读取CSV写入MySQL出现ProgrammingError与AttributeError求助

报错原因及修复方案

错误1:ProgrammingError: Not all parameters were used in the SQL statement

原因:

  • INSERT语句未指定插入列名,若TestTable的字段顺序、字段数量和你传入的records字段不匹配,就会出现参数数量不对应的问题
  • 读取的CSV单条记录字段数和SQL占位符数量(8个)不一致
    修复方法:
  1. 补全INSERT语句的列名,确保和你筛选的columns顺序完全对应
  2. 可提前校验每条记录的字段数量,避免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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:48:01