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

无法向数据库插入数据但提交始终返回成功的问题排查

问题排查与修复方案

我帮你找出了几个核心问题,这些就是导致数据无法写入数据库的关键原因:

1. 表单字段名与后端获取不匹配

你的HTML表单里,ID对应的输入框name是oracle_id,但后端代码里却用userDetails.getlist('id')来获取数据——这会导致oracle_id列表是空的,自然没有数据能插入到数据库里。

2. executemany用法错误,且字段参数不匹配

  • 首先,executemany的正确用法是传入SQL语句,再传入包含多个元组的列表(每个元组对应一条待插入的数据)。你现在直接传了单个元组,这不符合API要求,会导致SQL执行失败。
  • 其次,你的插入SQL语句中字段顺序是oracle_id, name, status, shift, remark,但你传的参数顺序是(id,oracle_id[i], name[i], status[i], remark[i])——这里不仅重复传递了oracle_id,还完全没给shift字段传值,参数数量和字段数量不匹配,SQL会静默执行失败(如果没有捕获异常的话)。

3. 缺乏异常捕获与事务回滚

一旦SQL执行出错,当前事务会处于未提交状态,但你的代码直接返回了SUCCESS,既没有捕获异常也没有回滚事务——这会让你误以为插入成功,但实际上数据根本没写入数据库。


修正后的后端代码

@app.route('/submit', methods=['GET','POST'])
def submit():
    if request.method == 'POST':
        cur = connection.cursor()
        userDetails = request.form
        # 修正:和表单name对应,获取oracle_id列表
        oracle_ids = userDetails.getlist('oracle_id')
        names = userDetails.getlist('name')
        statuses = userDetails.getlist('status')
        remarks = userDetails.getlist('remark')
        
        # 准备批量插入的数据列表
        insert_data = []
        for idx in range(len(oracle_ids)):
            # 注意:shift字段需要你补充实际值来源,这里暂时用默认值示例
            # 如果表单里有shift字段,就改成 userDetails.getlist('shift')[idx]
            shift_value = "default_shift"  
            insert_data.append(
                (oracle_ids[idx], names[idx], statuses[idx], shift_value, remarks[idx])
            )
        
        stmt = "INSERT INTO attendance(oracle_id, name, status, shift, remark) VALUES(%s, %s, %s, %s, %s)"
        try:
            # 正确使用executemany:传入SQL和数据列表
            cur.executemany(stmt, insert_data)
            connection.commit()
            return 'That is success'
        except Exception as e:
            # 出错时回滚事务,返回错误信息方便调试
            connection.rollback()
            return f"Error occurred: {str(e)}"
        finally:
            # 确保游标关闭,避免资源泄漏
            cur.close()
    return render_template('take_attendance.html')

HTML表单的补充说明

如果你的attendance表中shift字段是必填项,建议在表单里添加对应的输入控件,比如:

<td><input type="text" name="shift" size="10" value="your_shift_default"></td>

然后后端就可以用shifts = userDetails.getlist('shift')获取,替换代码里的shift_value为shifts[idx]。如果是可选字段,就给它设置合理的默认值即可。


额外调试小技巧

  1. 在后端代码里添加打印语句,比如print("Received data:", oracle_ids, names),确认是否从表单拿到了正确的数据。
  2. 开启Flask的调试模式(设置app.debug = True),这样如果有SQL错误,会直接在页面上显示详细报错信息,快速定位问题。
  3. 检查数据库表结构,确保字段类型和你插入的参数类型匹配(比如oracle_id是字符串还是数字,和表单传入的一致)。

内容的提问来源于stack exchange,提问作者spacearound

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:25:12