首页 > 编程问答 >如果值达到 800,如何创建 MySQL 函数来更新数据库?

如果值达到 800,如何创建 MySQL 函数来更新数据库?

时间:2024-09-25 04:07:07浏览次数:12  
标签:python mysql discord bots

我试图让数据库每秒检查一次表,看看 XP 值是否达到 800,如果达到,则将排名值设置为“Elite Genin”并将 XP 值设置为 0。

@bot.event
async def on_message(message):
    guild = message.guild.id
    table = "PEOPLE_" + str(guild)

    try:
        connection = mysql.connector.connect(
        host="localhost",
        port="3306",
        user="root",
        password="root",
        database="naruto_game"
        )
        cursor = connection.cursor()

        sql_event_query = """CREATE EVENT geninpromotion
                             ON SCHEDULE EVERY 1 Second
                             STARTS CURRENT_TIMESTAMP + INTERVAL 1 Second 
                             ENDS CURRENT_TIMESTAMP + INTERVAL 24 Hours 
                             DO UPDATE """ + table + """ SET rank = 'Elite Genin' where xp = 800 AND SET xp = 0"""
        cursor.execute(sql_event_query)

    except mysql.connector.Error as error:
        print("Failed to find name: {}".format(error))
    finally:
        if connection.is_connected():
            cursor.close()
            connection.close()
            print("MySQL connection has been closed.")
    print("Event created.")

但是当运行后我发送一条消息,出现此错误。

Failed to find name: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Hours DO UPDATE " + table + " SET rank = 'Elite Genin' where xp = 800 AND SET xp' at line 2

该错误告诉你你的 SQL 语法有问题。具体来说,MySQL 不喜欢 UPDATE 语句中的 AND 。你不能在 UPDATE 语句的 SET 子句中使用多个 SET

以下是如何使用 MySQL 事件和正确的语法创建所需功能的方法:

1. 创建存储过程:

首先,创建一个执行更新的存储过程:

DELIMITER //

CREATE PROCEDURE update_rank()
BEGIN
  UPDATE `PEOPLE_` + CAST(@guildId AS CHAR)
  SET rank = 'Elite Genin', xp = 0
  WHERE xp >= 800;
END //

DELIMITER ;

此存储过程执行以下操作:

  • 它接收 guildId 作为参数。
  • 它更新 PEOPLE_ 表,后跟 guildId
  • 如果 xp 大于或等于 800,则将 rank 设置为 'Elite Genin',并将 xp 设置为 0。

2. 创建事件:

现在,创建一个每秒调用此存储过程的事件:

sql_event_query = """
CREATE EVENT geninpromotion
ON SCHEDULE EVERY 1 SECOND
DO
BEGIN
  CALL update_rank(%s);
END
"""

cursor.execute(sql_event_query, (guild,))

此事件执行以下操作:

  • 它每秒调用一次 update_rank 存储过程。
  • 它将 guild 变量作为参数传递给存储过程。

重要注意事项:

  • 性能影响: 每秒更新数据库会对性能造成很大影响,尤其是在大型表中。考虑降低更新频率或探索其他选项(如消息队列)来处理此类任务。
  • 并发性: 如果你的应用程序同时修改 XP,你可能需要考虑使用事务或锁定机制来防止数据不一致。

通过这些更改,你的代码应该可以正常工作,并且你的事件将按预期更新数据库。但是,请务必考虑性能影响并根据需要调整代码。

标签:python,mysql,discord,bots
From: 79020207

相关文章

  • Chameleon 模板不替换 python 变量
    我是使用FastAPI和Python的Chameleon新用户。我在模板中有以下代码片段:${ag.name}在python代码中,我有一个类定义为:classAgeGroupInfo:definit(self,名称:str,检查:str):self.name=姓名self.checked=check视图字典包含AgeGroupInfo对象的列表......
  • 如何在 Python 中获得类似 Cron 的调度程序?
    我正在寻找一个Python库,它将提供at和cron类似的功能。我很想有一个纯Python解决方案,而不是依赖于安装在盒子上的工具;这样我就可以在没有cron的机器上运行。对于那些不熟悉cron的人:您可以根据如下表达式来安排任务:02**7/usr/bin/run......
  • 我找不到一种方法让我的 python print 语句在几秒钟后自行删除
    我正在尝试制作一款基于文本的冒险游戏,我希望能够让文本自行删除。举个例子,游戏将使用print()语句打印文本,5秒后文本将被删除或对玩家隐藏。我试图找到其他人与此问题相关的问题,并且我找不到任何信息。我不知道该使用什么命令或与之相关的任何内容,请帮忙。Ivetriedtof......
  • 在 python 中可视化四元数
    我在无人机上安装了一个IMU,每0.1秒收集一次四元数数据(w,x,y,z)。现在我想将四元数数据与实际的无人机方向(视频数据)进行比较。所以我想创建某种盒子对象来显示基于四元数数据的方向。我实现了以下教程,将四元数转换为欧拉以进行可视化:https://www.youtube.com/watch?......
  • 有没有办法在 python 中获取特定的键盘输入
    我正在为学校开发一个项目,它目前有行输入(“按Enter继续”),它可以工作,但只要用户按Enter键程序继续,输入是什么并不重要,而且我我希望它仅在按下特定键时才起作用。我查了一下,曾经有一个键盘模块,但由于某种莫名其妙的原因它被删除了,那么还有其他方式获取输入吗?你绝对可以......
  • python+flask计算机毕业设计基于微信小程序的法律问题咨询系统设计与实现(程序+开题+论
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网的飞速发展和智能手机的普及,人们获取信息和解决问题的途径日益多样化。在法律服务领域,传统的线下咨询方式已难以满足公众日益增......
  • python+flask计算机毕业设计基于人脸识别的医疗保险系统的设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着科技的飞速发展和人口老龄化的加剧,医疗保险系统面临着前所未有的挑战与机遇。传统医疗保险管理方式依赖于人工审核与纸质记录,不仅效率......
  • python+flask计算机毕业设计基于微信小程序的河南省美食分享平台(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在移动互联网时代,智能手机和社交媒体已成为人们日常生活不可或缺的一部分。微信小程序作为腾讯推出的一种轻量级应用形态,凭借其无需安装、......
  • python+flask计算机毕业设计基于微信小程序的网络文学管理平台(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网的迅猛发展,网络文学已成为当代文化生活中不可或缺的一部分,它不仅丰富了人们的阅读体验,还促进了文学创作的多元化与普及化。然而......
  • Python不同方式正倒序遍历的时间开销
    fromtimeitimporttimeitli=[iforiinrange(1000000)]deffor_loop(n):#使用for直接遍历ret=0foriinli:ret=li[i]deffor_loop_enumerate(n):#使用enumerate进行遍历ret=0foridx,iinenumerate(li):re......