python - 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 重置和升级查询中添加了一个条件,但它们仍然不起作用
解决方案
推荐阅读
- laravel - 在 laravel 中不仅存储 1 个文件
- microsoft-edge - 为什么打开 Microsoft Edge 开发工具会重新加载当前页面?
- ios - Waze “分享 ETA” 深层链接
- javascript - 使用角度 6 有条件地显示和隐藏按钮
- mysql - 发现很难做sql查询
- c++ - 基于不同枚举类值联合的模板化工厂
- wordpress - 嵌入变量作为 html 链接的主题
- c# - 对动态集合中具有空值的列进行排序时引发 ArgumentException
- combinations - 如何在asp.net c#中生成数字长度2的组合
- excel - 为什么在 Excel 中录制宏时,日期过滤器在数据透视表中不起作用?