时间:2021-05-22
1.之前的写法(不报错):
data = cursor.fetchall()
data_name = data[0]['task_type']
2.简洁的写法(报错):
data = cursor.fetchall()[0]['task_type']
用 2 的写法报错之后,一度怀疑是数据库出了问题。不服气用pycharm 的watch功能进行调试,更是错上加错。
错误原因:
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() 获取不到数据的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
sqlite3本身并没有像pymysql一样原生提供字典形式的游标。cursor=conn.cursor(pymysql.cursors.DictCursor)
在使用pymysql的时候,通过fetchall()或fetchone()可以获得查询结果,但这个返回数据是不包含字段信息的(不如php方便)。查阅pymysq
前言大家在使用pymysql的时候,通过fetchall()或fetchone()可以获得查询结果,但这个返回数据是不包含字段信息的(不如php方便)。查阅py
ElementUI的表格要求的数据类型为字典数组。我使用了python3写后端,那么从数据库取数据时添加一行cursorclass=pymysql.cursor
1、获取插入数据的主键idimportpymysqldatabase=pymysql.connect(host="127.0.0.1",port=3306,us