梦_蓝 2018-12-14 03:20 采纳率: 100%
浏览 1158
已采纳

pymysql(0.9.2) + mysql(5.7.23 ) 调用存储过程,获取输出参数有时为空

os : 16.4,
python : 3.6,
pymysql : 0.9.2,
mysql : 5.7.23

调用存储过程,获取输出参数有时为空
存储过程为

CREATE DEFINER=`root`@`%` PROCEDURE `P_TEST`(OUT aCode varchar(4), OUT aMsg varchar(16), IN aAppName varchar(16))
    COMMENT '测试'
BEGIN
    set aCode = '1';
    set aMsg = '错误信息';
        select aAppName;
  END

python端代码为:

def executeProc(aProcName, aParams):
    tmpDbConn = None
    tmpCursor = None
    try:
        tmpListData = list(aParams)
        tmpListData.insert(0, '')
        tmpListData.insert(0, '')
        aParams = tuple(tmpListData)
        print(aProcName, aParams)

        tmpDbConn = DBPools.connection()
        tmpCursor = DBPools.connection().cursor()
        tmpCursor.callproc(aProcName, aParams)
        tmpDatas1 = tmpCursor.fetchall()
        print(tmpDatas1)
        tmpCursor.execute('select @_%s_0, @_%s_1 ;' % (aProcName, aProcName))
        tmpDatas2 = tmpCursor.fetchall()
        print(tmpDatas2)
        code = tmpDatas2[0][0]
        msg = tmpDatas2[0][1]
        tmpCursor.close()
        tmpDbConn.close()
        return (code, msg, tmpDatas1)
    except InternalError as e:
        print(e)
        return (sqlServerInternalError, all_code[sqlServerInternalError])
    except ProgrammingError as e:
        print(e)
        return (sqlServerProgrammingError, all_code[sqlServerProgrammingError])
    except InterfaceError as e:
        print(e)
        return (sqlServerConnectFail, all_code[sqlServerConnectFail])
    except OperationalError as e:
        print(e)
        return (sqlServerInterfaceError, all_code[sqlServerInterfaceError])
    except Exception as e:
        print(e)
        return (sqlServerException, all_code[sqlServerException])
    finally:
        if tmpCursor:
            tmpCursor.close()
        if tmpDbConn:
            tmpDbConn.close()

if __name__ == "__main__":
    for i in range(100):
        executeProc('P_TEST', ('a'))

测试结果为:

P_TEST ('', '', 'a')
(('a',),)
(('1', '错误信息'),)
P_TEST ('', '', 'a')
(('a',),)
((None, None),)
P_TEST ('', '', 'a')
(('a',),)
((None, None),)
P_TEST ('', '', 'a')
(('a',),)
(('1', '错误信息'),)
P_TEST ('', '', 'a')
(('a',),)
(('1', '错误信息'),)

这种情况只是偶尔出现,单独调用存储过程也是没有问题的,请大佬帮忙解决一下,谢谢!

  • 写回答

1条回答 默认 最新

  • 梦_蓝 2018-12-14 03:47
    关注

    来个大佬,帮忙解决一下啊,别凉了啊
    数据库是 utf-8的,我在存储过程中指定编码,问题还是存在

    CREATE DEFINER=`root`@`%` PROCEDURE `P_TEST`(OUT aCode varchar(4), OUT aMsg varchar(16) CHARACTER SET UTF8  , IN aAppName varchar(16))
        COMMENT '测试'
    BEGIN
        set aCode = '1';
        set aMsg = '错误信息';
            select aAppName;
      END
    

    =----------------=-------------------=-----------------------
    自己来结一下,最后发现不是pymysql 模块的问题,是DButils的锅,我的天,把它去了就解决了!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵