好程式設計師Python培訓分享簡述fetchone()函式

好程式設計師發表於2020-10-30

  fetchone() 函式報 'NoneType' object is not subscriptable 的錯誤今天有人向我 請教一道 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() :將只取最上面的第一條結果,返回單個元組如 ('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 只返回一維元組。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2731258/,如需轉載,請註明出處,否則將追究法律責任。

相關文章