为什么cursor.fetchone()返回{'1':1}而非预期的表行数据?
问题原因
你的SQL查询语句指定的返回内容是常量1,而非用户表的字段,所以DictCursor会把常量名作为字典的键,常量值作为字典的值,最终返回{'1': 1}的结果,这是符合SQL执行逻辑的正常返回,不是扩展的问题。
解决方案
- 如果你只是要验证该用户名和密码对应的用户是否存在,现有逻辑已经可以满足需求:只要
cursor.fetchone()返回的结果不为空,就说明账号密码匹配,无需关心返回的字典内容。 - 如果你需要获取匹配用户的具体字段信息,将SQL语句中的
SELECT 1替换为你需要查询的字段列表即可,示例如下:
# 替换原有execute语句 cursor.execute('SELECT username, password FROM users WHERE username = %s AND password = %s', [name, password]) row = cursor.fetchone() # 此时row就会返回类似 {'username': 'Bob', 'password': 'hunter2'} 的结构
安全提示
不要在数据库中存储明文密码,生产环境请使用bcrypt等专用哈希算法对密码加盐处理后再存储,校验时也只需比对密码哈希值即可,避免数据库泄露后用户明文密码直接外泄。
内容的提问来源于stack exchange,提问作者GirkovArpa
相关产品推荐
相关产品推荐

