Discord.py开发:如何将语音频道ID存入sqlite3及报错解决
问题原因
你当前执行的INSERT语句将Python变量getid、getguild直接写在了SQL字符串中,SQLite解析语句时会将这两个名称识别为数据表的字段名,而你的channel_data表中不存在这两个字段,因此抛出字段不存在的错误。
解决方法
- 使用SQLite参数化查询传递变量,不要直接把变量名写入SQL字符串,同时注意执行写入操作后需要调用
conn.commit()提交事务,否则数据不会实际写入数据库文件。 - 你代码里声明的全局变量
getid、getguild没有必要,直接把变量作为参数传给execute方法即可。
修正后的assign命令代码
import sqlite3 # 数据库连接初始化不需要用global声明,只要在作用域内可访问即可 conn = sqlite3.connect('test.db') c = conn.cursor() @bot.command() async def assign(ctx): try: getid = ctx.author.voice.channel.id getguild = ctx.author.guild.id # 用?作为占位符,变量按顺序放在第二个参数的元组里 c.execute("INSERT INTO channel_data VALUES (?, ?, '1')", (str(getid), str(getguild))) # 提交事务,必须添加,否则修改不会保存到数据库文件 conn.commit() await ctx.send('Channel assigned.') except AttributeError: await ctx.send('Please join a voice channel first.')
额外优化建议
- 捕获异常时最好指定具体异常类型(比如上面的
AttributeError,对应用户没加入语音频道时ctx.author.voice为None的情况),不要用裸except,避免屏蔽其他未知错误。 - 因为你表中
id和guild_id字段是STRING类型,插入时最好把Discord返回的整数类型ID显式转为字符串,避免类型不匹配问题。 - 如果需要支持同一个服务器修改绑定的频道,可以先判断当前guild_id是否已经存在于表中,存在就执行UPDATE,不存在再执行INSERT,避免重复插入数据。
内容的提问来源于stack exchange,提问作者Hurai Geran
相关产品推荐
相关产品推荐

