Python调用存储过程查询仅返回存在数据行的实现问题
核心问题梳理
原代码无法正常运行的原因有4个:
- 语法错误:Python不存在
is exists的判断写法,属于语法误用;同时三元表达式逻辑写反,和预期的「空值填默认值、非空返回原值」逻辑完全相反 - 变量未定义:
cursor.fetchall()返回的是结果行列表,代码没有遍历结果集就直接使用row变量,运行时会直接抛出NameError - 边界缺失:没有处理「查询不到任何匹配UserId数据」的场景,空结果下强行取行下标会触发下标越界错误
- 资源泄漏:游标使用完成后没有关闭,长期运行会占用数据库连接资源
修复后可直接运行的代码
def CurrentRunning(UserId): cursor = connection.cursor() try: # 若使用pyodbc驱动连接SQL Server,请将参数占位符%s替换为? cursor.execute('EXEC [dbo].[sp_GetCurrentRunningActivity] @UserId=%s', (UserId,)) result_set = cursor.fetchall() data = [] # 逐行遍历查询结果,无匹配数据时循环不会执行,data保持空列表 for row in result_set: data.append({ 'TaskId': row[0], 'Value1': row[1], 'Value2': row[2], 'SelectedTeam': 0 if row[3] is None else row[3], 'Level1': '0' if row[4] is None else row[4], 'Level2': '0' if row[5] is None else row[5], 'Level3': '0' if row[6] is None else row[6], 'Level4': '0' if row[7] is None else row[7], 'TotalVolume': '0' if row[8] is None else row[8], 'ReturnDate': '0' if row[9] is None else row[9], }) print('Activity') return Response(data) finally: # 确保游标无论是否报错都会被关闭 cursor.close()
补充优化建议
如果业务规则明确每个UserId同一时间最多只有一条运行中活动,可以把
fetchall()替换为fetchone(),省去循环逻辑:先判断fetchone()返回的row是否为None,不为None再构造字典返回即可,查询性能更高。
修复后的逻辑完全符合需求:有匹配数据行时自动将空字段填充为默认值后返回,无匹配数据行时返回空列表结构,不会抛出异常。
内容的提问来源于stack exchange,提问作者kelvin003
相关产品推荐
相关产品推荐

