解决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实现简单的四则运算计算器
Nov 02 Python
python爬虫爬取网页表格数据
Mar 07 Python
Python中的二维数组实例(list与numpy.array)
Apr 13 Python
Python Series从0开始索引的方法
Nov 06 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 Python
python 检查数据中是否有缺失值,删除缺失值的方式
Dec 02 Python
pytorch:实现简单的GAN示例(MNIST数据集)
Jan 10 Python
tensorflow如何继续训练之前保存的模型实例
Jan 21 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
Mar 09 Python
Python闭包装饰器使用方法汇总
Jun 29 Python
python批量修改文件名的示例
Sep 27 Python
Flask response响应的具体使用
Jul 15 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 获取本机外网/公网IP的代码
2010/05/09 PHP
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
开启PHP Static 关键字之旅模式
2015/11/13 PHP
关于php中一些字符串总结
2016/05/05 PHP
php获取当前url地址的方法小结
2017/01/10 PHP
javascript:history.go()和History.back()的区别及应用
2012/11/25 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
jQuery实现多按钮单击变色
2014/11/27 Javascript
node.js中的url.parse方法使用说明
2014/12/10 Javascript
javascript二维数组转置实例
2015/01/22 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
面试常见的js算法题
2017/03/23 Javascript
babel的使用及安装配置教程
2018/02/22 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
2018/05/01 Javascript
JavaScript 判断对象中是否有某属性的常用方法
2018/06/14 Javascript
Vue 列表上下过渡效果的实例代码
2019/06/25 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
Python脚本实现12306火车票查询系统
2016/09/30 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
numpy.where() 用法详解
2019/05/27 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
全球领先的各类汽车配件零售商:Advance Auto Parts
2016/08/26 全球购物
Booking.com西班牙:全球酒店预订
2018/03/30 全球购物
Jdbc数据访问技术面试题
2012/03/30 面试题
毕业生个人求职的自我评价
2013/10/28 职场文书
秋季开学典礼主持词
2014/03/19 职场文书
事业单位分类改革实施方案
2014/03/21 职场文书
校园标语大全
2014/06/19 职场文书
小学数学教研活动总结
2014/07/01 职场文书
机修车间主任岗位职责
2015/04/08 职场文书
2016年社区六一儿童节活动总结
2016/04/06 职场文书
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript
用python自动生成日历
2021/04/24 Python
pytorch查看网络参数显存占用量等操作
2021/05/12 Python