解决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使用win32com库播放mp3文件的方法
May 30 Python
python 打印出所有的对象/模块的属性(实例代码)
Sep 11 Python
使用Python将数组的元素导出到变量中(unpacking)
Oct 27 Python
Python使用sorted排序的方法小结
Jul 28 Python
Python数据结构与算法之完全树与最小堆实例
Dec 13 Python
Python简单计算给定某一年的某一天是星期几示例
Jun 27 Python
10分钟教你用Python实现微信自动回复功能
Nov 28 Python
详解django+django-celery+celery的整合实战
Mar 19 Python
华为校园招聘上机笔试题 扑克牌大小(python)
Apr 22 Python
Python的条件锁与事件共享详解
Sep 12 Python
python ctypes库2_指定参数类型和返回类型详解
Nov 19 Python
Python使用tkinter实现摇骰子小游戏功能的代码
Jul 02 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
德生S2000收音机更换“钕铁硼”全频扬声器
2021/03/02 无线电
PHP检测用户语言的方法
2015/06/15 PHP
smarty简单应用实例
2015/11/03 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
子页向父页传值示例
2013/11/27 Javascript
JS与C#编码解码
2013/12/03 Javascript
js的touch事件的实际引用
2014/10/13 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
JavaScript中的类数组对象介绍
2014/12/30 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐)
2016/06/23 Javascript
关于Bootstrap按钮组件消除黄框的方法
2017/05/19 Javascript
JavaScript操作文件_动力节点Java学院整理
2017/06/30 Javascript
vue异步axios获取的数据渲染到页面的方法
2018/08/09 Javascript
Angular2 自定义表单验证器的实现方法
2018/12/14 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
vuex存储token示例
2019/11/11 Javascript
详解vue中在父组件点击按钮触发子组件的事件
2020/11/13 Javascript
浅谈Ant Design Pro 菜单自定义 icon
2020/11/17 Javascript
[02:27]刀塔重生降临
2015/10/14 DOTA
Python和JavaScript间代码转换的4个工具
2016/02/22 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
利用Python检测URL状态
2019/07/31 Python
python web框架中实现原生分页
2019/09/08 Python
python从zip中删除指定后缀文件(推荐)
2019/12/05 Python
Python嵌套函数,作用域与偏函数用法实例分析
2019/12/26 Python
中专生求职自荐信范文
2013/12/22 职场文书
开业庆典答谢词
2014/01/18 职场文书
创业融资计划书
2014/04/25 职场文书
2015会计试用期工作总结
2014/12/12 职场文书
宇宙与人观后感
2015/06/05 职场文书
javaScript Array api梳理
2021/03/31 Javascript
MySQL 四种连接和多表查询详解
2021/07/16 MySQL
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js
Python3使用Qt5来实现简易的五子棋小游戏
2022/05/02 Python