Python sqlite3执行带变量的SELECT查询后结果判断不生效如何解决?
问题诱因
- 核心原因:sqlite3的
cursor.fetchone()方法在查询命中记录时,返回的是由查询字段组成的元组结构,即使仅查询单个字段,返回结果格式为(字段值,)而非单独的数值。你直接将该返回值与整数100、200做等值判断,元组和整数永远不可能相等,因此条件始终无法触发。 - 额外隐患:代码中直接使用f字符串拼接SQL语句,存在SQL注入风险,不符合安全规范;同时未做无匹配记录的空值判断,也未关闭数据库连接,存在异常崩溃和资源泄漏的风险。
修复方案
修改后的代码如下:
import sqlite3 if message.content.startswith("!Cooltime"): con = sqlite3.connect("Hamal.db") cur = con.cursor() # 改用参数化查询,规避SQL注入风险 cur.execute("SELECT CoolTime FROM UserInfo WHERE DiscordId = ?", (message.author.id,)) exist = cur.fetchone() # 先判断是否存在匹配记录,避免空值报错 if exist: cool_time = exist[0] #------here-------- if cool_time == 100: print(1) if cool_time == 200: print(2) #----------------- # 关闭数据库连接,释放资源 con.close()
修复逻辑说明:
- 调整取值逻辑:从
fetchone()返回的元组中取出第一个元素,拿到实际的CoolTime数值后再做等值判断 - 优化查询写法:将SQL字符串拼接改为参数化查询,用
?作为占位符,参数传入execute方法的第二个元组参数中,避免SQL注入 - 补充边界处理:增加无匹配记录的空值判断,避免运行时报错;新增数据库连接关闭逻辑,避免资源泄漏
内容的提问来源于stack exchange,提问作者user15168118
相关产品推荐
相关产品推荐

