解决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测试驱动开发实例
Oct 08 Python
Python中实现参数类型检查的简单方法
Apr 21 Python
Python3中简单的文件操作及两个简单小实例分享
Jun 18 Python
python分析作业提交情况
Nov 22 Python
Django视图和URL配置详解
Jan 31 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 Python
python配置grpc环境
Jan 01 Python
python实发邮件实例详解
Nov 11 Python
Python Pillow(PIL)库的用法详解
Sep 19 Python
Python中BeautifulSoup通过查找Id获取元素信息
Dec 07 Python
pycharm进入时每次都是insert模式的解决方式
Feb 05 Python
Python 装饰器(decorator)常用的创建方式及解析
Apr 24 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数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
文字幻灯片
2006/06/26 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
JS、CSS以及img对DOMContentLoaded事件的影响
2014/08/12 Javascript
Jquery弹出层插件ThickBox的使用方法
2014/12/09 Javascript
javascript实现继承的简单实例
2015/07/26 Javascript
判断是否存在子节点的实现代码
2016/05/18 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
2019/08/27 Javascript
JavaScript之Blob对象类型的具体使用方法
2019/11/29 Javascript
浅谈Python中的闭包
2015/07/08 Python
Python中的多行注释文档编写风格汇总
2016/06/16 Python
Python中的is和==比较两个对象的两种方法
2017/09/06 Python
pytorch构建网络模型的4种方法
2018/04/13 Python
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
2018/10/15 Python
python 计算平均平方误差(MSE)的实例
2019/06/29 Python
Django 请求Request的具体使用方法
2019/11/11 Python
web页面录屏实现
2019/02/12 HTML / CSS
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
自荐书封面下载
2013/11/29 职场文书
运动会广播稿200米
2014/01/27 职场文书
汽车装潢店创业计划书范文
2014/02/05 职场文书
文艺晚会主持词
2014/03/24 职场文书
金融管理专业求职信
2014/07/10 职场文书
离婚协议书的范本
2015/01/27 职场文书
公司安全管理制度范本
2015/08/05 职场文书
婚庆答谢词大全
2015/09/29 职场文书
《水浒传》读后感3篇(范文)
2019/09/19 职场文书
nginx实现发布静态资源的方法
2021/03/31 Servers
php引用传递
2021/04/01 PHP