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

Discord.py开发:如何将语音频道ID存入sqlite3及报错解决

问题原因

你当前执行的INSERT语句将Python变量getid、getguild直接写在了SQL字符串中,SQLite解析语句时会将这两个名称识别为数据表的字段名,而你的channel_data表中不存在这两个字段,因此抛出字段不存在的错误。

解决方法

  1. 使用SQLite参数化查询传递变量,不要直接把变量名写入SQL字符串,同时注意执行写入操作后需要调用conn.commit()提交事务,否则数据不会实际写入数据库文件。
  2. 你代码里声明的全局变量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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:39:02