Python循环调用存储过程时如何保持sid变量跨循环复用
问题根因
sid无法持久复用的核心原因有3个:
sid = '0'的初始化语句写在了遍历JSON数组的for循环内部,每处理一条数组元素,都会先把sid强制重置为'0',上一轮拿到的返回值直接被覆盖。- 代码缩进错误:处理存储过程返回值、给sid赋值的逻辑错位到了外层循环的外部,根本不会在每轮遍历中执行。
return Response(row[0])写在了循环结构内,第一条数据处理完就会直接返回接口响应,后面的所有数组元素根本不会进入执行流程。
修复方案
核心调整逻辑:
- 把sid初始化移到循环外层,仅在接口刚进入时赋值一次初始值'0'
- 修正所有代码缩进,保证存储过程调用、返回值处理的逻辑都在遍历请求数据的循环内部
- 增加判断,仅第一次执行(sid仍为初始值'0')时,才将存储过程返回值更新到sid变量,后续轮次直接复用该固定值,不做覆盖
- 把响应返回逻辑移到所有循环执行完成后,避免提前终止遍历
- 优化数据库游标创建逻辑,避免循环内重复建连造成性能损耗和连接泄漏
修复后的完整代码如下:
@api_view(['POST']) def SaveUserResponse(request): if request.method == 'POST': # sid仅初始化一次,放在循环外层 sid = '0' final_sid = None cursor = connection.cursor() for ran in request.data: print(type(ran),'QId--',ran.get('QId'), ran) print(type(request.data)) auditorid = ran.get('AuditorId') print('SaveUserResponse auditorid---', auditorid) ticketid = ran.get('TicketId') qid = ran.get('QId') answer = ran.get('Answer') # 循环内不再重置sid,直接传入当前持有的sid值 cursor.execute('EXEC [dbo].[sp_SaveAuditResponse] @auditorid=%s,@ticketid=%s,@qid=%s,@answer=%s,@sid=%s', (auditorid,ticketid,qid,answer, sid)) result_st = cursor.fetchall() print('sp_SaveAuditResponse', result_st) # 修正缩进,在循环内部处理存储过程返回值 for row in result_st: print('sp_SaveAuditResponse', row) # 仅第一次执行时更新sid为存储过程返回值,后续不再修改 if sid == '0': sid = str(row[0]) final_sid = row[0] # 所有数据处理完成后统一关闭游标、返回响应 cursor.close() return Response(final_sid)
效果说明
调整后首次调用存储过程传入初始值0,拿到返回的类似8463的结果后会将sid固定为该值,后续所有循环调用存储过程都会持续传入这个固定sid,不会出现每轮重置的问题,请求中携带的所有JSON数组元素都会被依次处理完成后再返回接口响应。
内容的提问来源于stack exchange,提问作者kelvin003
相关产品推荐
相关产品推荐

