解决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中捕捉详细异常信息的代码示例
Sep 18 Python
在Linux下调试Python代码的各种方法
Apr 17 Python
python交互式图形编程实例(三)
Nov 17 Python
python 按照固定长度分割字符串的方法小结
Apr 30 Python
python直接获取API传递回来的参数方法
Dec 17 Python
Python根据欧拉角求旋转矩阵的实例
Jan 28 Python
Python之指数与E记法的区别详解
Nov 21 Python
python 中值滤波,椒盐去噪,图片增强实例
Dec 18 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
Mar 01 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
Mar 07 Python
django 实现手动存储文件到model的FileField
Mar 30 Python
Keras—embedding嵌入层的用法详解
Jun 10 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
星际RPG字典
2020/03/04 星际争霸
ioncube_loader_win_5.2.dll的错误解决方法
2015/01/04 PHP
php使用递归函数实现数字累加的方法
2015/03/16 PHP
PHP实现QQ空间自动回复说说的方法
2015/12/02 PHP
php提交过来的数据生成为txt文件
2016/04/28 PHP
php判断/计算闰年的方法小结【三种方法】
2019/07/06 PHP
laravel 修改.htaccess文件 重定向public的解决方法
2019/10/12 PHP
JS 学习笔记 防止发生命名冲突
2009/07/30 Javascript
改变javascript函数内部this指针指向的三种方法
2010/04/23 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
2016/12/04 Javascript
JS实现的tab切换选项卡效果示例
2017/02/28 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
2017/03/02 Javascript
jQuery轻松实现无缝轮播效果
2017/03/22 jQuery
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
2017/08/17 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
2017/11/01 Javascript
python基础入门学习笔记(Python环境搭建)
2016/01/13 Python
Python将图片转换为字符画的方法
2020/06/16 Python
python 读取dicom文件,生成info.txt和raw文件的方法
2019/01/24 Python
Django框架使用mysql视图操作示例
2019/05/15 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
在Pytorch中计算自己模型的FLOPs方式
2019/12/30 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
来自Ocado的宠物商店:Fetch
2018/07/10 全球购物
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
init进程的作用
2012/04/12 面试题
有针对性的求职自荐信
2013/11/14 职场文书
初中生学习的自我评价
2013/11/14 职场文书
小学生安全保证书
2014/02/01 职场文书
2014国培学习感言
2014/03/05 职场文书
园艺师求职信
2014/03/10 职场文书
《月亮湾》教学反思
2014/04/14 职场文书
促销活动总结报告
2014/04/26 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
2019 入党申请书范文
2019/07/10 职场文书
日本动漫十大公认神作:第五现已全网禁播,《死亡笔记》在榜
2022/03/18 日漫