解决pymysql cursor.fetchall() 获取不到数据的问题

作者:匡威~万斯 时间:2024-01-29 09:00:19 

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()都会出现这种情况

来源:https://www.cnblogs.com/vanser/p/11290364.html

标签:pymysql,cursor,fetchall,数据
0
投稿

猜你喜欢

  • pytest用yaml文件编写测试用例流程详解

    2022-04-19 03:55:29
  • python实现简单图片物体标注工具

    2021-09-07 21:31:50
  • 关于浏览器的一些观点

    2008-08-06 12:48:00
  • 深入SQL SERVER 2000的内存管理机制

    2010-04-25 10:52:00
  • python中通过selenium简单操作及元素定位知识点总结

    2021-07-18 15:34:37
  • Python实现轻松切割MP3文件

    2023-09-23 21:40:32
  • javascript 精确获取样式属性(上)

    2024-04-17 09:45:37
  • ubuntu系统下 python链接mysql数据库的方法

    2024-01-19 22:05:20
  • MySQL Semisynchronous Replication介绍

    2024-01-12 19:42:02
  • 关于Flask项目无法使用公网IP访问的解决方式

    2021-01-03 10:04:00
  • 如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱

    2022-07-03 20:51:47
  • class和id命名探讨

    2007-10-16 17:55:00
  • 使用python将微信image下.dat文件解密为.png的方法

    2022-11-12 06:39:38
  • 详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)

    2022-06-23 16:42:41
  • 聊聊QT添加MySQL驱动依赖的问题

    2024-01-14 10:25:58
  • Python机器学习库scikit-learn安装与基本使用教程

    2022-01-17 14:19:03
  • Python assert断言声明,遇到错误则立即返回问题

    2022-05-10 13:38:50
  • python定义具名元组实例操作

    2023-05-16 22:22:55
  • python和php哪个更适合写爬虫

    2023-10-28 00:51:14
  • XML+ JS创建树形菜单

    2013-08-22 08:30:17
  • asp之家 网络编程 m.aspxhome.com