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

Flask API返回数据重复问题求助:67条数据库记录却返回大量重复项

问题分析与解决方案

问题根源

你的代码中final_dict是全局变量,每次调用PostList的get方法时,都会将查询到的数据库记录追加到这个全局列表中,不会清空原有内容。这就导致第一次请求返回67条数据,第二次请求返回134条(67×2),以此类推,出现数据重复且数量持续增加的情况。

另外还有一个隐藏问题:return jsonify(final_dict)之后的cursor.close()和conn.close()永远不会执行,会导致数据库连接资源无法正常释放。

修复后的代码

from flask import Flask, jsonify
from flaskext.mysql import MySQL
from flask_restful import Resource, Api
from flask_cors import CORS

app = Flask(__name__)
CORS(app)    
#Create an instance of MySQL
mysql = MySQL()    
#Create an instance of Flask RESTful API
api = Api(app)

#Set database credentials in config.
app.config['MYSQL_DATABASE_USER'] = 'xxx'
app.config['MYSQL_DATABASE_PASSWORD'] = 'xxx'
app.config['MYSQL_DATABASE_DB'] = 'xxx'
app.config['MYSQL_DATABASE_HOST'] = 'xxx'

#Initialize the MySQL extension
mysql.init_app(app)
keys_dict = ["id", "link", "title", "date", "image", "description", "tag"]

class PostList(Resource):
    def get(self):
        final_dict = []  # 将列表移到方法内部,每次请求重新初始化
        conn = mysql.connect()
        cursor = conn.cursor()
        cursor.execute("""SELECT * from table ORDER BY date """)
        rows = cursor.fetchall()
       
        for m in rows:
            final_dict.append(dict(zip(keys_dict, m)))
        
        # 先关闭连接再返回响应
        cursor.close()
        conn.close()
        return jsonify(final_dict)

api.add_resource(PostList, '/', endpoint='')

if __name__  == '__main__':
    app.run(debug=True)

关键修改点

  • 将final_dict的定义从全局作用域移到get方法内部,确保每次请求都创建新的空列表,彻底避免数据累积重复。
  • 调整cursor.close()和conn.close()的位置到return语句之前,保证数据库连接能正常关闭,防止资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:21:06