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()
关键改动说明
- 合并三次查询为一次,提升效率,同时用
%s作为参数占位符,将用户ID放在元组中传递,彻底避免SQL注入风险。 - 用
cursor.fetchone()获取查询结果,先判断是否存在数据,防止用户无数据时触发报错。 - 使用f-string(字符串前加
f)实现变量替换,确保输出实际数据而非变量名。 - 修正游标和数据库连接的关闭方式,添加括号执行方法。
内容的提问来源于stack exchange,提问作者racin36er
相关产品推荐
相关产品推荐

