无输入输出MySQL存储过程如何通过Python的MySQLdb获取结果?
解决MySQLdb调用无参数存储过程无法获取结果的问题
当然可以不用修改存储过程就能拿到结果!我之前也碰到过一模一样的情况,问题出在MySQLdb对存储过程结果集的处理逻辑上。
当你用cursor.callproc()调用存储过程后,MySQL服务器会先返回一个空的"执行确认"结果集(用来告知客户端存储过程执行完成),而你需要的真实数据结果集在这个空结果集的后面。直接调用fetchall()只会拿到这个空结果集,自然看不到数据。
具体解决步骤
只需要在callproc()之后,先调用cursor.nextset()跳过这个空结果集,再执行fetchall()就能拿到真实数据了:
import MySQLdb # 重要:存储过程耗时20秒,务必设置足够长的超时时间避免连接中断 connection = MySQLdb.connect( host="你的数据库地址", user="用户名", passwd="密码", db="数据库名", connect_timeout=30, # 连接超时时间 read_timeout=30 # 读取超时时间,适配20秒的执行时长 ) cursor = connection.cursor() cursor.callproc('store_procedure', ()) # 跳过存储过程返回的第一个空结果集 cursor.nextset() # 现在就能获取到预期的多行数据了 res = cursor.fetchall() # 后续数据处理逻辑... cursor.close() connection.close()
额外说明
如果你的存储过程内部包含多个SELECT语句(会返回多个结果集),可以循环调用cursor.nextset()直到它返回None,再依次获取每个结果集的数据。不过根据你的描述,非Python环境下正常返回多行,说明只需要一次nextset()就足够了。
另外一定要注意超时设置!默认的MySQLdb连接超时可能短于20秒,会导致存储过程还没执行完就被Python断开连接,这也会出现拿不到结果的情况。
内容的提问来源于stack exchange,提问作者pioupiou
相关产品推荐
相关产品推荐

