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

Python Discord机器人定时任务循环无法写入MySQL数据库求助

问题排查与修复方案

一、语法错误类问题

  • logging表插入SQL语法错误:你写的INSERT INTO logging语句里有多余的等号,message_deletion=字段后多打了=符号,直接导致SQL语法校验失败,执行被中断。
  • add_bans插入语句拼接时缺少空格,最终生成的SQL为INSERT INTO stats(member_count, bans),MySQL严格模式下会触发语法错误,建议在拼接节点加空格修改为"INSERT INTO stats " "(member_count, bans) " "VALUES (%s, %s)"。

二、执行逻辑错误

  • 工具类execute和execute_data_input函数错误添加了multi=True参数:你所有操作都是单条SQL语句,加multi=True会要求处理多结果集迭代器,未处理的情况下单条SQL执行会被挂起,就算执行commit也不会写入数据,直接删除两个函数里的multi=True参数即可。
  • 全局使用cnx和cursor连接对象,异步定时任务场景下多协程会抢占连接资源,前一个任务的连接还没完成写入就被后一个connect操作覆盖,导致写入错乱或执行失败。

三、业务代码逻辑错误

  • UPDATE语句直接用format拼接字符串,一旦成员昵称、服务器名包含单引号会直接触发SQL语法错误,同时存在严重注入风险,所有写操作必须改用参数化查询,和execute_data_input的用法一致。
  • User = discord.Member这里直接赋值类对象,dm = User.dm_channel取到的是类属性不是当前成员的实际属性,值永远为None,若对应数据库字段设置了非空约束会直接触发写入失败,需修改为dm = member.dm_channel。
  • UPDATE语句的WHERE条件如果没有匹配到对应数据行,不会返回错误也不会产生任何写入,建议执行更新前先判断对应行是否存在,不存在优先执行插入操作。

四、临时快速修复步骤

  1. 删除所有cursor.execute调用中的multi=True参数
  2. 删掉logging插入SQL里message_deletion后的多余等号
  3. 所有用format拼接的UPDATE语句改为参数化查询,通过execute_data_input执行
  4. 异步场景下不要使用全局连接,每次数据库操作都创建独立连接,避免协程抢占资源

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:36:03