解决pymysql cursor.fetchall() 获取不到数据的问题


Posted in Python onMay 15, 2020

1.之前的写法(不报错):

data = cursor.fetchall()
data_name = data[0]['task_type']

2.简洁的写法(报错):

data = cursor.fetchall()[0]['task_type']

用 2 的写法报错之后,一度怀疑是数据库出了问题。不服气用pycharm 的watch功能进行调试,更是错上加错。

解决pymysql cursor.fetchall() 获取不到数据的问题

错误原因:

cursor.fetchall() 相当于从数据库取数据,但是取完就没有了,再下一行继续 cursor.fetchall(),取到的就只是空列表。他和变量不一样,不能重复查询,推荐第一种写法,将数据取出来之后,放到一个变量里,再进行处理。

用watch 功能更是添乱。

补充知识:VScode pymysql模块fetchall方法取不到值bug

这个问题是个很神奇的东西,简单来说就是用fetchall()取cusor中的_rows的值,明明_rows里面存在值,但依然取出来为空,看了一会pymysql里cursor里的源码,大概地了解到这个bug的表面原因:

原因:

cursor,在其内部有个rownumber的变量,作用大概就是“游标”的意思吧,如果你是用fetchone()方法,取出来的就是第一个数,然后将游标移到下一位,下次去取就是从游标的位置开始还不是从_rows里的起始位置开始,fetchmany()同理,另外,cursor中还提供了直接移动游标的方法,也就是scroll方法,接下来,我们具体分析下fetchall的代码:

def fetchall(self):
  """Fetch all the rows"""
  self._check_executed()
  if self._rows is None:
   return ()
  if self.rownumber:
   result = self._rows[self.rownumber:]
  else:
   result = self._rows
  self.rownumber = len(self._rows)
  return result

代码简洁明了,如果_rows里面没值,确实是在数据库中没查到,那就返回空,如果有游标,那从游标位置开始取,否则,直接返回_rows整个结果集,然后将游标移到最后,问题将出在这,我可以确定每次执行完查询以后,我都关闭了游标,未关闭db连接,并且,不会针对同一次查询多次fetchall(),但是在执行的时候,有时候即使是第一次fetchall()方法,游标依然在最后,然后我给cursor中所有的rownumber的赋值语句全部加了断点,这些断点都没执行的情况下,rownumber的值依然变了,这足以确定不是pymysql的代码问题

解决方案:

这就更能确定是vscode的编译模块的问题了,新建一个py文件,将原代码原封不动的复制过去,再执行,竟然将这么好了?!就是这么神奇,什么代码没动,换个文件将好了,然后,这个bug是偶发性的,并不是每次fetchall()都会出现这种情况

以上这篇解决pymysql cursor.fetchall() 获取不到数据的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python pickle类库介绍(对象序列化和反序列化)
Nov 21 Python
用实例解释Python中的继承和多态的概念
Apr 27 Python
Python实现替换文件中指定内容的方法
Mar 19 Python
浅谈python中requests模块导入的问题
May 18 Python
mac安装scrapy并创建项目的实例讲解
Jun 13 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
Jul 01 Python
Python3实现汉语转换为汉语拼音
Jul 08 Python
python UDP(udp)协议发送和接收的实例
Jul 22 Python
python psutil监控进程实例
Dec 17 Python
python实现遍历文件夹图片并重命名
Mar 23 Python
Python常用数据分析模块原理解析
Jul 20 Python
Python发送邮件实现基础解析
Aug 14 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
May 15 #Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
May 15 #Python
django 利用Q对象与F对象进行查询的实现
May 15 #Python
Python实现电视里的5毛特效实例代码详解
May 15 #Python
python中wx模块的具体使用方法
May 15 #Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 #Python
python随机模块random的22种函数(小结)
May 15 #Python
You might like
php 正则匹配函数体
2009/08/25 PHP
PHP中用hash实现的数组
2011/07/17 PHP
如何用PHP做到页面注册审核
2017/03/02 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
jquery animate 动画效果使用说明
2009/11/04 Javascript
『jQuery』.html(),.text()和.val()的概述及使用
2013/04/22 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
javascript中setInterval的用法
2015/07/19 Javascript
vue货币过滤器的实现方法
2017/04/01 Javascript
基于jQuery.i18n实现web前端的国际化
2018/05/04 jQuery
深入浅析javascript函数中with
2018/10/28 Javascript
js+html5 canvas实现ps钢笔抠图
2019/04/28 Javascript
浅谈redux, koa, express 中间件实现对比解析
2019/05/23 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
[46:40]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python使用xlrd模块读写Excel文件的方法
2015/05/06 Python
python实现读Excel写入.txt的方法
2018/04/29 Python
关于tf.reverse_sequence()简述
2020/01/20 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
2020/02/25 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
详解CSS3 弹性布局快速入门
2019/06/06 HTML / CSS
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
kmart凯马特官网:美国最大的打折零售商和全球最大的批发商之一
2016/11/17 全球购物
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
La Redoute英国官网:法国时尚品牌
2017/04/27 全球购物
大学生期末自我鉴定
2014/02/01 职场文书
舞蹈教育学专业自荐信
2014/06/15 职场文书
小学感恩教育活动总结
2014/07/07 职场文书
初中成绩单评语
2014/12/29 职场文书
团代会开幕词
2015/01/28 职场文书
2015暑假实习报告范文
2015/07/13 职场文书
教学副校长工作总结
2015/08/13 职场文书