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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:18:20