解决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实现发送和获取手机短信验证码
Jan 15 Python
基于Python 装饰器装饰类中的方法实例
Apr 21 Python
利用Python在一个文件的头部插入数据的实例
May 02 Python
对Python中实现两个数的值交换的集中方法详解
Jan 11 Python
在python里面运用多继承方法详解
Jul 01 Python
python join方法使用详解
Jul 30 Python
python各层级目录下import方法代码实例
Jan 20 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
Jun 11 Python
python与c语言的语法有哪些不一样的
Sep 13 Python
Python字典dict常用方法函数实例
Nov 09 Python
解决PDF 转图片时丢文字的一种可能方式
Mar 04 Python
python套接字socket通信
Apr 01 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在多维数组中根据键名快速查询其父键以及父键值的代码
2011/05/07 PHP
php mssql扩展SQL查询中文字段名解决方法
2012/10/15 PHP
PHP header()函数常用方法总结
2014/04/11 PHP
PHP编写简单的App接口
2016/08/28 PHP
总结一些PHP中好用但又容易忽略的小知识
2017/06/02 PHP
javascript cookies 设置、读取、删除实例代码
2010/04/12 Javascript
JavaScript 原型与继承说明
2010/06/09 Javascript
javascript插入样式实现代码
2012/02/22 Javascript
ie与ff下的event事件使用介绍
2013/11/25 Javascript
JSON+HTML实现国家省市联动选择效果
2014/05/18 Javascript
jquery阻止后续事件只执行第一个事件
2014/07/24 Javascript
javascript组合使用构造函数模式和原型模式实例
2015/06/04 Javascript
js如何实现点击标签文字,文字在文本框出现
2015/08/05 Javascript
Vue.js教程之计算属性
2016/11/11 Javascript
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
2020/03/25 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
python备份文件以及mysql数据库的脚本代码
2013/06/10 Python
python编写暴力破解FTP密码小工具
2014/11/19 Python
Python字符串详细介绍
2015/05/09 Python
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
2019/09/20 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
Scotch Porter官方网站:男士美容产品
2020/08/31 全球购物
工商管理专业应届生求职信
2013/11/04 职场文书
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
美术指导求职信
2014/03/17 职场文书
酒店开业庆典主持词
2014/03/21 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
2019毕业典礼主持词!
2019/07/05 职场文书
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle