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

Python sqlite3执行带变量的SELECT查询后结果判断不生效如何解决?

问题诱因

  1. 核心原因:sqlite3的cursor.fetchone()方法在查询命中记录时,返回的是由查询字段组成的元组结构,即使仅查询单个字段,返回结果格式为(字段值,)而非单独的数值。你直接将该返回值与整数100、200做等值判断,元组和整数永远不可能相等,因此条件始终无法触发。
  2. 额外隐患:代码中直接使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:39:05