解決pymysql cursor.fetchall() 獲取不到數(shù)據(jù)的問(wèn)題
1.之前的寫法(不報(bào)錯(cuò)):
data = cursor.fetchall()
data_name = data[0]['task_type']
2.簡(jiǎn)潔的寫法(報(bào)錯(cuò)):
data = cursor.fetchall()[0]['task_type']
用 2 的寫法報(bào)錯(cuò)之后,一度懷疑是數(shù)據(jù)庫(kù)出了問(wèn)題。不服氣用pycharm 的watch功能進(jìn)行調(diào)試,更是錯(cuò)上加錯(cuò)。
錯(cuò)誤原因:
cursor.fetchall() 相當(dāng)于從數(shù)據(jù)庫(kù)取數(shù)據(jù),但是取完就沒(méi)有了,再下一行繼續(xù) cursor.fetchall(),取到的就只是空列表。他和變量不一樣,不能重復(fù)查詢,推薦第一種寫法,將數(shù)據(jù)取出來(lái)之后,放到一個(gè)變量里,再進(jìn)行處理。
用watch 功能更是添亂。
補(bǔ)充知識(shí):VScode pymysql模塊fetchall方法取不到值bug
這個(gè)問(wèn)題是個(gè)很神奇的東西,簡(jiǎn)單來(lái)說(shuō)就是用fetchall()取cusor中的_rows的值,明明_rows里面存在值,但依然取出來(lái)為空,看了一會(huì)pymysql里cursor里的源碼,大概地了解到這個(gè)bug的表面原因:
原因:
cursor,在其內(nèi)部有個(gè)rownumber的變量,作用大概就是“游標(biāo)”的意思吧,如果你是用fetchone()方法,取出來(lái)的就是第一個(gè)數(shù),然后將游標(biāo)移到下一位,下次去取就是從游標(biāo)的位置開(kāi)始還不是從_rows里的起始位置開(kāi)始,fetchmany()同理,另外,cursor中還提供了直接移動(dòng)游標(biāo)的方法,也就是scroll方法,接下來(lái),我們具體分析下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
代碼簡(jiǎn)潔明了,如果_rows里面沒(méi)值,確實(shí)是在數(shù)據(jù)庫(kù)中沒(méi)查到,那就返回空,如果有游標(biāo),那從游標(biāo)位置開(kāi)始取,否則,直接返回_rows整個(gè)結(jié)果集,然后將游標(biāo)移到最后,問(wèn)題將出在這,我可以確定每次執(zhí)行完查詢以后,我都關(guān)閉了游標(biāo),未關(guān)閉db連接,并且,不會(huì)針對(duì)同一次查詢多次fetchall(),但是在執(zhí)行的時(shí)候,有時(shí)候即使是第一次fetchall()方法,游標(biāo)依然在最后,然后我給cursor中所有的rownumber的賦值語(yǔ)句全部加了斷點(diǎn),這些斷點(diǎn)都沒(méi)執(zhí)行的情況下,rownumber的值依然變了,這足以確定不是pymysql的代碼問(wèn)題
解決方案:
這就更能確定是vscode的編譯模塊的問(wèn)題了,新建一個(gè)py文件,將原代碼原封不動(dòng)的復(fù)制過(guò)去,再執(zhí)行,竟然將這么好了?!就是這么神奇,什么代碼沒(méi)動(dòng),換個(gè)文件將好了,然后,這個(gè)bug是偶發(fā)性的,并不是每次fetchall()都會(huì)出現(xiàn)這種情況
以上這篇解決pymysql cursor.fetchall() 獲取不到數(shù)據(jù)的問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- pymysql模塊使用簡(jiǎn)介與示例
- pyMySQL SQL語(yǔ)句傳參問(wèn)題,單個(gè)參數(shù)或多個(gè)參數(shù)說(shuō)明
- pymysql之cur.fetchall() 和cur.fetchone()用法詳解
- python數(shù)據(jù)庫(kù)操作mysql:pymysql、sqlalchemy常見(jiàn)用法詳解
- 在python中使用pymysql往mysql數(shù)據(jù)庫(kù)中插入(insert)數(shù)據(jù)實(shí)例
- Python接口自動(dòng)化淺析pymysql數(shù)據(jù)庫(kù)操作流程
相關(guān)文章
利用python將xml文件解析成html文件的實(shí)現(xiàn)方法
下面小編就為大家分享一篇利用python將xml文件解析成html文件的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12詳解Python中的數(shù)據(jù)清洗工具flashtext
FlashText是GitHub上的一個(gè)開(kāi)源Python庫(kù),正如之前所提到的,它在提取關(guān)鍵字和替換關(guān)鍵字任務(wù)上有著極高的性能。本文將詳解一下flashtext的使用,需要的可以參考一下2022-06-06Python?Celery定時(shí)任務(wù)詳細(xì)講解
這篇文章主要介紹了Python?Celery定時(shí)任務(wù)詳細(xì)講解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08python3利用Dlib19.7實(shí)現(xiàn)人臉68個(gè)特征點(diǎn)標(biāo)定
這篇文章主要為大家詳細(xì)介紹了python3利用Dlib19.7實(shí)現(xiàn)人臉68個(gè)特征點(diǎn)標(biāo)定,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02Python打印scrapy蜘蛛抓取樹(shù)結(jié)構(gòu)的方法
這篇文章主要介紹了Python打印scrapy蜘蛛抓取樹(shù)結(jié)構(gòu)的方法,實(shí)例分析了打印scrapy蜘蛛抓取樹(shù)結(jié)構(gòu)的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04Python3.5面向?qū)ο缶幊虉D文與實(shí)例詳解
這篇文章主要介紹了Python3.5面向?qū)ο缶幊?結(jié)合圖文與實(shí)例形式詳細(xì)分析了Python面向?qū)ο缶幊滔嚓P(guān)的概念、類定義、實(shí)例化、實(shí)例變量、類變量、析構(gòu)函數(shù)等相關(guān)原理及使用技巧,需要的朋友可以參考下2019-04-04