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

Flutter发POST请求表更新成功却返回500及UNIQUE constraint failed错误

问题解决方案

根因分析

你遇到的数据库有更新但前端收到500、报UNIQUE约束失败的现象,核心原因大概率是短时间重复发起了携带相同trip_ID的POST请求:第一次请求插入成功(数据库生成对应记录),第二次请求插入相同主键触发唯一约束报错,前端最终收到的是第二次请求返回的500状态码。此外前后端状态码不匹配、数据库会话未做异常回滚也会放大问题。

具体修复方案

1. 修复重复请求问题

  • 在Flutter端的请求触发逻辑(如按钮点击事件)中增加防抖处理,或者设置请求中加载状态,禁止请求未完成前重复调用postTripDetails方法。
  • 在postTripDetails中打印传入的trip_ID值,同时在Flask接口中打印收到的trip_ID值,确认是否存在重复请求。

2. 优化Flask后端接口逻辑

增加主键预校验、异常捕获、会话回滚和状态码对齐,修改后的接口代码如下:

@app.route('/Trips', methods=['POST'])
def add_Trips():
    try:
        trip_ID = request.json['trip_ID']
        tripDates = request.json['tripDates']
        chosenAttractionsID = request.json['chosenAttractionsID']
        
        # 预校验主键是否已存在,提前拦截重复插入
        if Trips.query.filter_by(trip_ID=trip_ID).first():
            return {"error": "trip_ID已存在"}, 400
        
        new_trip = Trips(trip_ID, tripDates, chosenAttractionsID)
        db.session.add(new_trip)
        db.session.commit()
        
        # 返回201状态码和Flutter端的判断逻辑对齐
        return trip_schema.jsonify(new_trip), 201
    except Exception as e:
        # 异常时回滚会话,避免后续请求受影响
        db.session.rollback()
        # 打印详细错误日志方便排查
        print(f"接口报错:{str(e)}")
        return {"error": "服务器内部错误"}, 500

3. (推荐)改用数据库自增主键

避免前端生成主键带来的重复风险,修改Trips模型的主键配置,由数据库自动生成主键:

class Trips(db.Model):
    __tablename__ = 'Trips'
    # 增加autoincrement=True,不需要前端传trip_ID
    trip_ID = db.Column(db.Integer, primary_key=True, autoincrement=True)
    tripDates = db.Column(db.String(100))
    chosenAttractionsID = db.Column(db.String(100))

对应修改Flutter的请求body,去掉trip_ID参数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:54:02