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

Flask从带表头的TextAreaField导入CSV到MySQL循环报错求助

问题分析与修复方案

你的代码存在几个关键问题导致循环部分报错,逐一说明并给出修复方案:

1. 字符串无法直接调用iterrows()方法

form.import_data.data获取到的是纯文本字符串,并非pandas的DataFrame对象,因此没有iterrows()方法,必须先将字符串解析为可迭代的CSV格式数据。

2. cursor.execute()不存在if_exists参数

if_exists='append'是pandasto_sql()方法的专属参数,MySQLdb游标execute()不支持该参数,属于参数误用。

3. CSV表头与数据的空格问题

你提供的CSV数据中,表头description前带有空格,直接解析后列名会变为 description(带前置空格),后续取row['description']会出现键不存在的错误。


修复后的代码(基于csv模块,无需依赖pandas)

修改后的views.py:

import csv
from io import StringIO

@admin.route('/import_csv/new_data', methods=['GET', 'POST'])
@login_required
def import_data():
   mycursor = mydb.cursor()
   form = ImportServerForm()

   if form.validate_on_submit():
     # 将文本内容转为可读取的IO对象
     csv_io = StringIO(form.import_data.data)
     # 解析CSV,skipinitialspace忽略列名和数据前的空格
     reader = csv.DictReader(csv_io, skipinitialspace=True)

     for row in reader:
        sql = """
            INSERT INTO departements (name, description)
            VALUES (%s, %s)
          """
        value = (row['name'], row['description'])
        mycursor.execute(sql, value)
     # 批量提交更高效,无需每次循环都执行commit
     mydb.commit()

可选方案(基于pandas解析)

如果习惯使用pandas,可简化为以下写法:

import pandas as pd
from io import StringIO

@admin.route('/import_csv/new_data', methods=['GET', 'POST'])
@login_required
def import_data():
   form = ImportServerForm()

   if form.validate_on_submit():
     csv_io = StringIO(form.import_data.data)
     df = pd.read_csv(csv_io, skipinitialspace=True)
     # 用to_sql自动处理插入,if_exists='append'实现追加
     df.to_sql('departements', con=mydb, if_exists='append', index=False)
     mydb.commit()

内容的提问来源于stack exchange,提问作者Abdellah ALAOUI ISMAILI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:39:52