如何检查MySQL返回字典元素是否含指定整数,解决Discord机器人频道忽略功能报错
错误原因
- 你创建游标时指定了
dictionary=True,cursor.fetchall()返回的每条记录是字典结构,只能通过字段名(键名)访问值,不能用数字下标i[1]访问,这是报错的直接诱因。 - 即使正确取值,从你给出的示例数据来看
channel_ids字段存储的是单个整数,in运算符要求右侧为可迭代对象(列表、元组、集合等),直接对单个整数调用in判断也会触发类型错误。
解决方案
方案1:适配你当前的表结构(单条记录存1个排除频道ID)
直接通过字段名取值,做相等判断即可,同时建议把SQL拼接改成参数化查询,避免SQL注入风险:
cursor = db.cursor(dictionary=True) # 用参数化查询替代f字符串拼接SQL cursor.execute("SELECT * FROM `logexclude` WHERE server=%s", (int(before.guild.id),)) excluded = cursor.fetchall() for i in excluded: if before.channel.id == i['channel_ids']: return
方案2:如果你需要单条记录存多个排除频道ID
你需要先调整表结构,把channel_ids字段改为JSON类型,存储频道ID的数组,取值后转成列表再做in判断:
import json cursor = db.cursor(dictionary=True) cursor.execute("SELECT * FROM `logexclude` WHERE server=%s", (int(before.guild.id),)) excluded = cursor.fetchall() for i in excluded: excluded_channels = json.loads(i['channel_ids']) if i['channel_ids'] else [] if before.channel.id in excluded_channels: return
内容的提问来源于stack exchange,提问作者Pearoo
相关产品推荐
相关产品推荐

