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
关键修正说明
- 修复SQL语法:移除
order by后的分号,确保limit属于同一条查询语句,避免生成多语句查询。 - 全参数化查询:将
offset和limit转为整数后作为参数传递,彻底避免字符串拼接带来的风险和语法问题。 - 上下文管理器优化:用
with语句自动管理连接和游标,无需手动调用close(),避免资源泄漏和异常处理中的潜在错误。 - 参数校验前置:提前校验
offset和limit的类型,及时返回参数错误,避免后续SQL执行出错。
内容的提问来源于stack exchange,提问作者reodinas
相关产品推荐
相关产品推荐

