首页 > 解决方案 > 将 int 类型的变量带到 MySQL 到 Python

问题描述

我今天开始使用 MySQL。我正在一个不和谐机器人上创建我自己的关卡系统(我使用 discord.py),我无法从我的数据库中导入我需要的数字。

import discord
import random
from discord import client
from discord.ext import commands
import mysql.connector
from discord.utils import get
from random import choice

token = 'token'
client = commands.Bot(command_prefix='°')

levelsystem_db = mysql.connector.connect(
    host="localhost",
    user="root",
    passwd="pass",
    database="userlevels",
    auth_plugin="mysql_native_password"
)

@client.event
async def on_ready():
    print('Bot online')
    print(levelsystem_db)

@client.event
async def on_message(message):
    if message.author.bot:
        return
    xp = generateXP()
    print(f"{message.author.name} ha ricevuto {str(xp)} xp")
    cursor = levelsystem_db.cursor()
    cursor.execute(f"SELECT user_xp FROM users WHERE client_id = {str(message.author.id)}")
    result = cursor.fetchall()
    print(result)
    print(len(result))
    if (len(result) == 0):
        print("L'utente non è stato aggiunto al database.")
        cursor.execute(f"INSERT INTO users VALUES({str(message.author.id)} ,{str(xp)} , 0)")
        levelsystem_db.commit()
        print("Aggiunta completata")
        await level_up(cursor, xp, message.author, message)
    else:
        newXP = result[0][0] + xp
        print(f"Gli xp di {message.author.name} sono aggiornati a {newXP}")
        cursor.execute(f"UPDATE users SET user_xp = {str(newXP)} WHERE client_id = {str(message.author.id)}")
        levelsystem_db.commit()
        print(f"Aggiornamento degli xs di {message.author.name} completato.")
        await level_up(cursor, newXP, message.author, message)

def generateXP():
    return random.randint(5,10)

async def level_up(cursor, NewXP, user, message):
    cursor.execute(f"SELECT user_level FROM users WHERE client_id = {str(message.author.id)}")
    lvl_start = cursor.fetchall()
    lvl_end = int(NewXP ** (1/4))
    print(str(lvl_start))
    print(str(lvl_end))
    if (str(lvl_start) < str(lvl_end)):
        await message.channel.send(f"{user.mention} è salito al livello {lvl_end}")
        print(f"Il livello di {message.author.name} si sta aggiornando al livello {lvl_end}")
        cursor.execute(f"UPDATE users SET user_level = {str(lvl_end)} WHERE client_id = {str(message.author.id)}")
        levelsystem_db.commit()
        print(f"Aggiornamento del livello di {message.author.name} completato.")
    else:
        print("Non è abbastanza!")
        pass

给我带来问题的部分是:

cursor.execute(f"SELECT user_level FROM users WHERE client_id = {str(message.author.id)}")
lvl_start = cursor.fetchall()
lvl_end = int(NewXP ** (1/4))
print(str(lvl_start))
print(str(lvl_end))

我希望 lvl_start 变量将我带回整数和列表变量。我应该0从不print (str (lvl_start))得到[(0,)]。我不知道我是否说清楚了,但我想解决这个问题。有办法吗?

标签: mysqldiscord.py

解决方案


正如我所使用的那样mysql-python,它返回一个嵌套有元组的列表。如果我们用它来选择一行,它会返回一个嵌套了长度为 2 的元组的列表,其中第一个元素是行值,第二个是空白。因此,我建议您至少选择 2 行,然后使用嵌套列表的索引列表lvl_start[0][0]


推荐阅读