当前位置: 首页 / 技术分享 / 正文
好程序员Python培训分享简述fetchone()函数

2020-10-30

Python培训

  fetchone()函数报'NoneType' object is not subscriptable的错误今天有人向好程序员Python培训老师请教一道python操作mysql的题,我也是差一点掉坑里去了。题是这样的:python操作数据库,实现用户的注册登陆功能。其中最主要的是数据库的存入和读取。

Python2

其中一段代码如下:

#查询与用户名对应的密码

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说明对比的两个值中有一个是Noneself.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'),),

备注:其中的idtitle为具体的内容

pythonmysql在使用fetchall或者是fetchone时,综合起来讲,fetchall返回二维元组(元组中含有元组),fetchone只返回一维元组。

好程序员公众号

  • · 剖析行业发展趋势
  • · 分享大厂面试心得
  • · 汇聚企业项目源码
  • · 下载全套高精尖教程

好程序员开班动态

More+
  • HTML5大前端 <高端班>

    开班时间:2020-11-16(北京)

    开班盛况

    开班时间:2020-12-07(深圳)

    预约报名
  • 大数据+人工智能 <高端班>

    开班时间:2020-09-14(北京)

    开班盛况

    开班时间:2020-11-09(北京)

    开班盛况
  • JavaEE分布式开发 <高端班>

    开班时间:2021-01-04(北京)

    预约报名

    开班时间:2020-07-20(北京)

    开班盛况
  • Python人工智能+数据分析 <高端班>

    开班时间:2020-07-20(上海)

    开班盛况

    开班时间:2020-09-21(上海)

    开班盛况
  • 云计算开发 <高端班>

    开班时间:2019-07-22(北京)

    开班盛况

    开班时间:2019-07-15(深圳)

    开班盛况
在线咨询
免费试听
入学教程
立即报名

Copyright 2011-2020 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公安网11010802011455号