解决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实现向QQ群成员自动发邮件的方法
Nov 19 Python
优化Python代码使其加快作用域内的查找
Mar 30 Python
用yum安装MySQLdb模块的步骤方法
Dec 15 Python
Python中shape计算矩阵的方法示例
Apr 21 Python
Python+OpenCV人脸检测原理及示例详解
Oct 19 Python
Python简单实现网页内容抓取功能示例
Jun 07 Python
python得到qq句柄,并显示在前台的方法
Oct 14 Python
Python Scapy随心所欲研究TCP协议栈
Nov 20 Python
Python3.4解释器用法简单示例
Mar 22 Python
树莓派与PC端在局域网内运用python实现即时通讯
Jun 22 Python
利用Python模拟登录pastebin.com的实现方法
Jul 12 Python
Python selenium爬虫实现定时任务过程解析
Jun 08 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 var_dump遍历对象属性的函数与应用代码
2010/06/04 PHP
codeigniter框架批量插入数据
2014/01/09 PHP
PHP中if和or运行效率对比
2014/12/12 PHP
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
php数组函数array_key_exists()小结
2015/12/10 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
2017/10/06 PHP
JavaScript之编码规范 推荐
2012/05/23 Javascript
javascript学习笔记(八) js内置对象
2012/06/19 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
jQuery实现根据类型自动显示和隐藏表单
2015/03/18 Javascript
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
详解jQuery中基本的动画方法
2016/12/14 Javascript
JavaScript之map reduce_动力节点Java学院整理
2017/06/29 Javascript
Vue单文件组件基础模板小结
2017/08/10 Javascript
js封装成插件的步骤方法
2017/09/11 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
Vue父子组件之间的通信实例详解
2018/09/28 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
JS实现随机点名器
2020/04/12 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
低版本中Python除法运算小技巧
2015/04/05 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
2018/10/14 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
2019/06/28 Python
Python OpenCV调用摄像头检测人脸并截图
2020/08/20 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
Python dict的常用方法示例代码
2020/06/23 Python
python3定位并识别图片验证码实现自动登录功能
2021/01/29 Python
预备党员入党思想汇报
2014/01/04 职场文书
医院节能减排方案
2014/06/13 职场文书
杭州西湖英语导游词
2015/02/03 职场文书
安装工程师岗位职责
2015/02/13 职场文书
2015年读书月活动总结
2015/03/26 职场文书
公司处罚决定书
2015/06/24 职场文书
Golang 获取文件md5校验的方法以及效率对比
2021/05/08 Golang
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python