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

Flask API部署AWS Lambda后遇InternalError: Unread result found求助

解决Flask API在AWS Lambda上的MySQL "Unread result found"错误

问题根源分析

  • SQL语句语法错误:原查询中order by createdAt desc;后的分号会将SQL拆分为两个独立语句,第一个select执行后返回的结果集未被读取,第二个limit语句执行时触发"Unread result found"错误。
  • 字符串拼接SQL参数:直接将offset和limit(从request.args获取的字符串类型)拼入SQL,存在SQL注入风险,还可能引发语法异常。
  • 资源管理不当:手动关闭cursor和connection时,若try块中cursor未创建就抛出异常,except块的cursor.close()会触发新错误。

修正后的代码

from flask import request
from flask_restful import Resource
from mysql.connector import Error
from flask_jwt_extended import jwt_required, get_jwt_identity

from mysql_connection import get_connection

class OrderListResource(Resource):

    # 내 주문내역 조회 API
    @jwt_required()
    def get(self):

        userId = get_jwt_identity()
        # 直接设置默认值,减少判断逻辑
        offset = request.args.get('offset', '0')
        limit = request.args.get('limit', '20')

        # 校验并转换参数类型
        try:
            offset = int(offset)
            limit = int(limit)
        except ValueError:
            return {'error': 'Invalid offset or limit value'}, 400

        try:
            # 使用上下文管理器自动管理连接和游标
            with get_connection() as connection:
                query = '''
                        select *
                        from orders
                        where userId = %s
                        order by createdAt desc
                        limit %s, %s;
                        '''
                record = (userId, offset, limit)
                with connection.cursor(dictionary=True, buffered=True) as cursor:
                    cursor.execute(query, record)
                    result_list = cursor.fetchall()

                    # 格式化时间字段
                    for row in result_list:
                        row['reservTime'] = row['reservTime'].isoformat()
                        row['createdAt'] = row['createdAt'].isoformat()

        except Error as e:
            print(e)
            return {'error' : str(e)}, 500

        return {'result' : 'success',
                'items' : result_list,
                'count' : len(result_list)}, 200

关键修正说明

  1. 修复SQL语法:移除order by后的分号,确保limit属于同一条查询语句,避免生成多语句查询。
  2. 全参数化查询:将offset和limit转为整数后作为参数传递,彻底避免字符串拼接带来的风险和语法问题。
  3. 上下文管理器优化:用with语句自动管理连接和游标,无需手动调用close(),避免资源泄漏和异常处理中的潜在错误。
  4. 参数校验前置:提前校验offset和limit的类型,及时返回参数错误,避免后续SQL执行出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:30:30