解决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使用urllib模块开发的多线程豆瓣小站mp3下载器
Jan 16 Python
python实现字符串和日期相互转换的方法
May 13 Python
Python装饰器使用实例:验证参数合法性
Jun 24 Python
python中的编码知识整理汇总
Jan 26 Python
python编码最佳实践之总结
Feb 14 Python
Python中的默认参数实例分析
Jan 29 Python
django反向解析和正向解析的方式
Jun 05 Python
利用Python如何将数据写到CSV文件中
Jun 05 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
Apr 09 Python
python打包exe开机自动启动的实例(windows)
Jun 28 Python
PyTorch 解决Dataset和Dataloader遇到的问题
Jan 08 Python
selenium+超级鹰实现模拟登录12306
Jan 24 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&MYSQL服务器配置说明
2006/10/09 PHP
PHP 函数语法介绍一
2009/06/14 PHP
简单的php数据库操作类代码(增,删,改,查)
2013/04/08 PHP
php 使用curl模拟登录人人(校内)网的简单实例
2016/06/06 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
2018/08/20 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
jquery+javascript编写国籍控件
2015/02/12 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
2016/05/10 Javascript
分分钟玩转Vue.js组件
2016/10/25 Javascript
RGB和YUV 多媒体编程基础详细介绍
2016/11/04 Javascript
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
jquery学习笔记之无new构建详解
2017/12/07 jQuery
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
JS使用队列对数组排列,基数排序算法示例
2019/03/02 Javascript
Python GAE、Django导出Excel的方法
2008/11/24 Python
python开发简易版在线音乐播放器
2017/03/03 Python
Python使用asyncio包处理并发详解
2017/09/09 Python
对命令行模式与python交互模式介绍
2018/05/12 Python
python:print格式化输出到文件的实例
2018/05/14 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
Python如何创建装饰器时保留函数元信息
2020/08/07 Python
使用python实现学生信息管理系统
2021/02/25 Python
使用CSS3实现圆角,阴影,透明
2014/12/23 HTML / CSS
HTML5去掉输入框type为number时的上下箭头的实现方法
2020/01/03 HTML / CSS
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
教师专业理论水平的自我评价分享
2013/11/09 职场文书
农村改厕实施方案
2014/03/22 职场文书
优秀教导主任事迹材料
2014/05/09 职场文书
个人担保书范文
2014/05/20 职场文书
财务管理专业毕业生求职信
2014/06/02 职场文书
国庆节演讲稿范文2014
2014/09/19 职场文书
ConstraintValidator类如何实现自定义注解校验前端传参
2021/06/18 Java/Android
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫
python处理json数据文件
2022/04/11 Python