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

异步函数中使用递归实现Discord机器人start命令的用户注册问题

问题原因

你的递归逻辑本身没有语法错误,出现这个问题的核心原因是数据库事务的可见性问题:

  • 你的create_user(user_id)执行写入后,没有主动提交数据库事务,或者create_user和does_user_exist两个方法使用了独立的数据库连接
  • 未提交的写入对其他连接/会话不可见,导致递归调用时的does_user_exist查询仍然返回0,要么触发无限递归报错终止,要么始终走不到else分支发送欢迎消息
  • 只有当本次请求结束、数据库会话自动释放提交后,第二次手动执行命令才能读到已经持久化的用户记录

修复方案

方案1:坚持使用递归实现

只需要修改你的数据库操作逻辑,满足以下任意一个条件即可:

  • 确保create_user执行完成后主动提交当前事务(例如SQLAlchemy加db.session.commit(),sqlite3加conn.commit()),保证写入操作全局可见
  • 让does_user_exist和create_user复用同一个数据库连接,同连接下未提交的写入对自身查询可见

修改完成后你的原有递归代码即可正常运行。

方案2:更合理的非递归实现(推荐)

你的场景完全不需要使用递归,直接在创建用户后发送欢迎消息即可,既避免了事务问题,也减少了一次多余的数据库查询:

client = commands.Bot(command_prefix = '/')

# define commands
@client.command()
async def start(ctx):
    await start_command(ctx)


async def start_command(ctx):
    user_id : int = ctx.message.author.id
    result : int = does_user_exist(user_id) # 无记录返回0

    if result == 0:
        print('Create user')
        create_user(user_id)
        # 写入完成后直接走欢迎逻辑,不需要二次查询
    
    welcome_message = 'Welcome!'
    await ctx.send(welcome_message)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:06:08