无法向数据库插入数据但提交始终返回成功的问题排查
问题排查与修复方案
我帮你找出了几个核心问题,这些就是导致数据无法写入数据库的关键原因:
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]。如果是可选字段,就给它设置合理的默认值即可。
额外调试小技巧
- 在后端代码里添加打印语句,比如
print("Received data:", oracle_ids, names),确认是否从表单拿到了正确的数据。 - 开启Flask的调试模式(设置
app.debug = True),这样如果有SQL错误,会直接在页面上显示详细报错信息,快速定位问题。 - 检查数据库表结构,确保字段类型和你插入的参数类型匹配(比如
oracle_id是字符串还是数字,和表单传入的一致)。
内容的提问来源于stack exchange,提问作者spacearound
相关产品推荐
相关产品推荐

