You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 21:54:52