解决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计数排序和基数排序算法实例
Apr 25 Python
使用Python实现一个栈判断括号是否平衡
Aug 23 Python
5分钟 Pipenv 上手指南
Dec 20 Python
python异常处理和日志处理方式
Dec 24 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
Dec 27 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
Feb 06 Python
python实现logistic分类算法代码
Feb 28 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
Mar 09 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
Apr 26 Python
python中wheel的用法整理
Jun 15 Python
Python操作MySQL数据库的示例代码
Jul 13 Python
python Django框架快速入门教程(后台管理)
Jul 21 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小偷的核心程序
2007/04/09 PHP
PHP的pcntl多进程用法实例
2015/03/19 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
Javascript 各浏览器的 Javascript 效率对比
2008/01/23 Javascript
定义select的边框颜色
2008/04/28 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
javascript检测是否联网的实现代码
2014/09/28 Javascript
node.js中的fs.chmod方法使用说明
2014/12/18 Javascript
基于jQuery实现的旋转彩圈实例
2015/06/26 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
jquery mobile开发常见问题分析
2016/01/21 Javascript
JavaScript中通过提示框跳转页面的方法
2016/02/14 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
Vue实现数字输入框中分割手机号码的示例
2017/10/10 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
2017/10/15 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
vue实现pdf导出解决生成canvas模糊等问题(推荐)
2018/10/18 Javascript
jQuery zTree树插件的使用教程
2019/08/16 jQuery
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
python学习手册中的python多态示例代码
2014/01/21 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
2019/07/04 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
python3通过udp实现组播数据的发送和接收操作
2020/05/05 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
python 可视化库PyG2Plot的使用
2021/01/21 Python
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
大专生自荐书范文
2014/06/22 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
车间质检员岗位职责
2015/04/08 职场文书
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python