2020-10-30
Python培訓
fetchone()函數報'NoneType' object is not subscriptable的錯誤今天有人向好程序員Python培訓老師請教一道python操作mysql的題,我也是差一點掉坑里去了。題是這樣的:python操作數據庫,實現用戶的注冊登陸功能。其中最主要的是數據庫的存入和讀取。
其中一段代碼如下:
#查詢與用戶名對應的密碼
sql = "select hash_password from user where username ='{}'".format(self.username)
self.cursor.execute(sql)
#輸出查詢結果
print(self.cursor.fetchone()[0])
print(self.passwd)
#對比,查詢結果與加密后的密碼
if self.cursor.fetchone()[0] == self.passwd:
print('登錄成功')
else:
print('請輸入正確的密碼')
乍一看沒什么錯,但是執行報錯了,
e10adc3949ba59abbe56e057f20f883e
e10adc3949ba59abbe56e057f20f883e
rl.login()
File "xxxxxx", line 314,in login
if self.cursor.fetchone()[0] == self.passwd:
TypeError: 'NoneType' object is not subscriptable
怎么回事呢?明明輸出的兩個密碼是一樣的,怎么對比出錯呢,而且報錯也很奇怪,NoneType說明對比的兩個值中有一個是None,self.passwd排除,那只能說self.cursor.fetchone()[0]是None,我將if注釋了,再次print()輸出一下self.cursor.fetchone()[0],果然又報錯了
print(self.cursor.fetchone()[0])
TypeError: 'NoneType' object is not subscriptable
這下捉急了,百度唄,查了半天也沒查到什么。過了一會才想起如果mysql執行語句結果的查詢集只有一行數據,是不能調用兩次self.cursor.fetchone()的,也就是說,第二次調用根本不可能有結果。那我把代碼改一下好了。
sql = "select hash_password from user where username ='{}'".format(self.username)
self.cursor.execute(sql)
sql_password = self.cursor.fetchone()[0]
print(sql_password)
print(self.passwd)
if sql_password == self.passwd:
print('登錄成功')
else:
print('請輸入正確的密碼')
OK,成功了,沒報錯了,可真不容易。
用法如下所示:
fetchone()用法:
cur.execute("select host,user,password from user where user='%s'" %acc)
jilu = cur.fetchone() ##此時 通過 jilu[0],jilu[1],jilu[2]可以依次訪問host,user,password
fetchall()用法:
cur.execute("select * from user")
如果select本身取的時候有多條數據時:
cursor.fetchone():將只取最上面的diyi條結果,返回單個元組如('id','title'),然后多次使用cursor.fetchone(),依次取得下一條結果,直到為空。
cursor.fetchall() :將返回所有結果,返回二維元組,如(('id','title'),('id','title')),
如果select本身取的時候只有一條數據時:
cursor.fetchone():將只返回一條結果,返回單個元組如('id','title')。
cursor.fetchall() :也將返回所有結果,返回二維元組,如(('id','title'),),
備注:其中的id和title為具體的內容
python在mysql在使用fetchall或者是fetchone時,綜合起來講,fetchall返回二維元組(元組中含有元組),fetchone只返回一維元組。
開班時間:2021-04-12(深圳)
開班盛況開班時間:2021-05-17(北京)
開班盛況開班時間:2021-03-22(杭州)
開班盛況開班時間:2021-04-26(北京)
開班盛況開班時間:2021-05-10(北京)
開班盛況開班時間:2021-02-22(北京)
開班盛況開班時間:2021-07-12(北京)
預約報名開班時間:2020-09-21(上海)
開班盛況開班時間:2021-07-12(北京)
預約報名開班時間:2019-07-22(北京)
開班盛況Copyright 2011-2023 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公網安備 11010802035720號