SQLite查询结果与Python变量匹配失败问题排查
问题解决方法
你的核心问题是类型不匹配:c.fetchall()返回的是Python列表对象,而你把check转换成了字符串形式的列表文本,这两个永远不可能相等。另外,SELECT操作不需要执行conn.commit(),提交事务只针对修改数据的操作(比如INSERT/UPDATE/DELETE)。
修正后的代码(两种可选方式)
方式1:直接判断查询结果是否非空
如果查询到匹配的邮箱,fetchall()会返回包含对应记录的列表;如果没匹配到,返回空列表。所以直接判断列表是否非空即可:
import sqlite3 check = "Benclarke2016@hotmail.com" conn = sqlite3.connect("U+P.db") c = conn.cursor() # 执行查询 c.execute("SELECT email FROM details WHERE email = ?", (check,)) r = c.fetchall() # 判断是否查询到结果 if r: print("correct email") email = True else: print("incorrect email") conn.close()
方式2:提取查询结果中的邮箱字符串对比
如果需要精确对比邮箱内容,可以从查询结果中提取具体的字符串再比较:
import sqlite3 check = "Benclarke2016@hotmail.com" conn = sqlite3.connect("U+P.db") c = conn.cursor() c.execute("SELECT email FROM details WHERE email = ?", (check,)) r = c.fetchall() # 若有结果,提取第一个记录的第一个字段(邮箱) if r and r[0][0] == check: print("correct email") email = True else: print("incorrect email") conn.close()
额外说明
- Mac系统和这个问题无关,不用考虑系统差异影响。
- 后续结合PyQt时,只需要把这段逻辑放到按钮的点击事件处理函数里即可。
内容的提问来源于stack exchange,提问作者Ben Clarke
相关产品推荐
相关产品推荐

