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

Python开发Discord Bot:SQL数据召回时变量无法解析求助

问题解决:Discord Bot召回数据时输出变量名而非实际值

你的代码存在几个关键问题,以下是修正方案:

核心问题分析

  • 字符串未格式化:普通字符串中的{cp1}不会被自动解析为变量值,需要用格式化语法让Python替换变量内容。
  • SQL查询结果获取错误:cursor.execute()仅执行查询,不会直接返回结果,需调用fetchone()/fetchall()提取数据;同时你重复执行查询并错误传递游标对象给execute(),完全没必要。
  • SQL注入风险:直接拼接ctx.author.id到SQL语句中存在安全隐患,必须用参数化查询。
  • 资源未正确关闭:cursor.close和mydb.close是方法,需加括号调用才会执行关闭操作。

修正后的代码

async def picks(ctx):
    # 一次查询获取三个字段,用参数化查询避免SQL注入
    cursor.execute("SELECT currentpick1, currentpick2, currentpick3 FROM nascarpool WHERE id = %s", (ctx.author.id,))
    # 获取查询结果,fetchone()返回一行数据(元组格式)
    picks_data = cursor.fetchone()
    
    if picks_data:
        cp1, cp2, cp3 = picks_data
        # 使用f-string格式化字符串,替换为变量实际值
        await ctx.send(f"You have registered the following picks: {cp1}, {cp2}, and {cp3}")
    else:
        await ctx.send("You haven't registered any picks yet.")
    
    # 正确调用关闭方法
    cursor.close()
    mydb.close()

关键改动说明

  1. 合并三次查询为一次,提升效率,同时用%s作为参数占位符,将用户ID放在元组中传递,彻底避免SQL注入风险。
  2. 用cursor.fetchone()获取查询结果,先判断是否存在数据,防止用户无数据时触发报错。
  3. 使用f-string(字符串前加f)实现变量替换,确保输出实际数据而非变量名。
  4. 修正游标和数据库连接的关闭方式,添加括号执行方法。

内容的提问来源于stack exchange,提问作者racin36er

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:15:19