Python从SQLite获取密码与用户输入密码比对失败问题解决
问题根源
cursor.fetchone()的返回值是元组(tuple):哪怕你的SQL语句只查询了password这一列,方法也会把匹配到的整行数据按字段顺序封装在元组里返回。你打印看到的(1234,)就是单元素元组的标准格式,和input()拿到的字符串类型密码属于完全不同的数据结构,直接做==判断永远不会成立。- 手动输入
(1234,)也无法通过校验的原因:input()的返回值永远是字符串,你输入的内容会被识别为普通文本"(1234,)",和Python运行时的元组对象(1234,)本质是完全不同的数据,不可能匹配成功。 - 隐藏的类型坑:如果数据库里
password字段设为整数类型,取出的密码值是int格式的1234,而用户输入的密码是字符串格式的"1234",即便你拿到了正确的值,不同类型的内容比对依然会返回False。
修复步骤
- 从
fetchone()返回的元组中取下标为0的元素,这才是你查到的真实密码值 - 把数据库取出的密码统一转成字符串,和用户输入的字符串类型密码做比对,规避类型不一致问题
- 增加用户名不存在的判断逻辑,避免查无数据时直接取下标抛出异常
- 数据库操作完成后主动关闭连接,避免资源泄漏
修复后的可运行代码:
import sqlite3 # 连接数据库创建游标对象 connection = sqlite3.connect('/path/to/db') cursor = connection.cursor() # 根据输入的用户名查询对应密码 name = input('Enter your name: ') cursor.execute("SELECT password FROM users WHERE name = ?",(name,)) db_result = cursor.fetchone() # 校验用户名是否存在 if not db_result: print("User not exist") connection.close() exit() # 取出元组中存储的真实密码值,统一转成字符串和用户输入做比对 pin = str(db_result[0]) # 密码校验逻辑 while True: password = input('Enter Your Password: ') if password == pin: print(f'Welcome {name}') break else: print('Password Incorrect.') # 操作完成关闭数据库连接 connection.close()
内容的提问来源于stack exchange,提问作者akinajin
相关产品推荐
相关产品推荐

