解决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 实现文件的递归拷贝实现代码
Aug 02 Python
python实现将html表格转换成CSV文件的方法
Jun 28 Python
用Python实现斐波那契(Fibonacci)函数
Mar 25 Python
Python构建网页爬虫原理分析
Dec 19 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
Apr 12 Python
python实现括号匹配的思路详解
Aug 23 Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 Python
Python实现FTP弱口令扫描器的方法示例
Jan 31 Python
Django 全局的static和templates的使用详解
Jul 19 Python
python2和python3实现在图片上加汉字的方法
Aug 22 Python
python使用Thread的setDaemon启动后台线程教程
Apr 25 Python
Pycharm配置autopep8实现流程解析
Nov 28 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 cron中的批处理
2008/09/16 PHP
新浪微博API开发简介之用户授权(PHP基础篇)
2011/09/25 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
2014/06/24 PHP
PHP中使用SimpleXML检查XML文件结构实例
2015/01/07 PHP
php英文单词统计器
2016/06/23 PHP
JavaScript禁止页面操作的示例代码
2013/12/17 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
JS常用加密编码与算法实例总结
2016/12/22 Javascript
Javascript实现时间倒计时效果
2017/07/15 Javascript
Javascript中this关键字指向问题的测试与详解
2017/08/11 Javascript
layui实现table加载的示例代码
2018/08/14 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
2018/12/29 Javascript
深入理解nodejs搭建静态服务器(实现命令行)
2019/02/05 NodeJs
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
如何在JavaScript中使用localStorage详情
2021/02/04 Javascript
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
用python给自己做一款小说阅读器过程详解
2019/07/11 Python
Python中six模块基础用法
2019/12/08 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
python 通过文件夹导入包的操作
2020/06/01 Python
使用Python将语音转换为文本的方法
2020/08/10 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
法国一家芭蕾舞鞋公司:Repetto
2018/11/12 全球购物
Craghoppers德国官网:户外和旅行服装
2020/02/14 全球购物
毕业生个人求职的自我评价
2013/10/28 职场文书
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
村官学习十八大感想
2014/01/15 职场文书
新任教师自我鉴定
2014/02/24 职场文书
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
个人作风建设总结
2014/10/23 职场文书
2015年公路养护工作总结
2015/05/13 职场文书
《藏戏》教学反思
2016/02/23 职场文书
银行求职信怎么写
2019/06/20 职场文书
Python re.sub 反向引用的实现
2021/07/07 Python