首页 > 解决方案 > SQLite3 未将字段值设置为指定值

问题描述

所以,我正在制作一个不和谐的机器人,我想添加一个调平系统,但它不起作用(我没有收到任何错误)。问题是:每当我升级时,我都没有。我的意思是当我升级时,它会说:“@Crabby 已经达到了 2 级,GG!” 但是当我查看数据库时,我是第 1 级。虽然它确实重置了 exp,但这只会让人更加困惑为什么升级部分不起作用。无论如何,这是代码:

    @commands.Cog.listener()
    async def on_message(self, message):
        # Role variables
        lvl_5_role = discord.utils.get(message.guild.roles, name='Memeling (Level 5+)')
        lvl_10_role = discord.utils.get(message.guild.roles, name='Memer (Level 10+)')
        lvl_15_role = discord.utils.get(message.guild.roles, name='Ultimate Memer (Level 15+)')
        # Checking if the author is not a bot (This prevents a loop)
        if not message.author.bot:
            # Database variables
            db = sqlite3.connect('database\main.sqlite3')
            cursor = db.cursor()
            cursor.execute(f"SELECT user_id FROM levels WHERE guild_id = '{message.guild.id}' and user_id = '{message.author.id}'")
            result = cursor.fetchone()
            #  End of primary variables
            if result is None:
                sql = ("INSERT INTO levels(guild_id, user_id, exp, lvl) VALUES(?, ?, ?, ?)")
                val = (message.guild.id, message.author.id, 10, 0)
                cursor.execute(sql, val)
                db.commit()
            else:
                cursor.execute(f"SELECT user_id, exp, lvl FROM levels WHERE guild_id = '{message.guild.id}' and user_id = '{message.author.id}'")
                result1 = cursor.fetchone()
                exp = int(result1[1])
                sql = ("UPDATE levels SET exp = ? WHERE guild_id = ? and user_id = ?")
                val = (exp + random.randint(1, 5), str(message.guild.id), str(message.author.id))
                cursor.execute(sql, val)
                db.commit()

                cursor.execute(f"SELECT user_id, exp, lvl FROM levels WHERE guild_id = '{message.guild.id}' and user_id = '{message.author.id}'")
                result2 = cursor.fetchone()

                xp_start = int(result2[1])
                lvl_start = int(result2[2])
                xp_end = math.floor(5 * (lvl_start ^ 2) + 50 * lvl_start + 100)

                if xp_end < xp_start:
                    await message.channel.send(f"{message.author.mention} has reached level {lvl_start + 1}, GG!")
                    
                    if lvl_start == 5:
                        message.author.add_roles(lvl_5_role)
                    elif lvl_start == 10:
                        message.author.add_roles(lvl_10_role)
                    elif lvl_start == 15:
                        message.author.add_roles(lvl_15_role)
                    sql = "UPDATE levels SET lvl = ? and user_id = ?"
                    val = str(lvl_start + 1), str(message.author.id)
                    cursor.execute(sql, val)
                    db.commit()
                    sql = "UPDATE levels SET exp = ? and guild_id = ? and user_id = ?"
                    val = 0, str(message.guild.id), str(message.author.id)
                    cursor.execute(sql, val)
                    db.commit()
                    cursor.close()
                    db.close()
        # if the author is a bot
        else:
            pass

注意:我正在使用 Python 3.8.6 和 discord.py 重写

编辑:我已将代码缩小到 on_message() 侦听器,因为我认为这就是问题所在。另外,我已经对其进行了测试,它确实可以正确地将我从 0 级升级到 1 级,但是在那之后,当我获得足够的 XP 进行升级时,它根本不会升级我,但它仍然会重置我的 XP为 0

编辑 2:我在 exp 重置和升级查询中添加了一个条件,但它们仍然不起作用

标签: pythondatabasesqlitediscord.pydiscord.py-rewrite

解决方案


推荐阅读