Python Forum
Answer for newbie, Sqlite3 - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: Homework (https://python-forum.io/forum-9.html)
+--- Thread: Answer for newbie, Sqlite3 (/thread-40796.html)



Answer for newbie, Sqlite3 - Froger - Sep-25-2023

I made a discord bot on a task using plugins Sqlite3,Json,Disnake. But I got such an error as no such column: Speed. I searched for the problem on the internet, but all the ways did not help. Here is my code:
import disnake
from disnake.ext import commands
import sqlite3
import json

# Создайте подключение к базе данных (файл "bot_database.db")conn = sqlite3.connect('bot_database.db')
cursor = conn.cursor()


cursor.execute('''
    CREATE TABLE IF NOT EXISTS user_scores (
        user_id INTEGER PRIMARY KEY,
        score INTEGER DEFAULT 0,
        Speed INTEGER DEFAULT 0,
        Strength INTEGER DEFAULT 0,
        Magic INTEGER DEFAULT 0,
        Toughness INTEGER DEFAULT 0
    )
''')

conn.commit()

cursor.execute('''
    CREATE TABLE IF NOT EXISTS variables (
        name TEXT PRIMARY KEY,
        value TEXT
    )
''')
conn.commit()


def load_variables():
    global Your_ochki, Attributes
    try:
        with open('config.json', 'r') as config_file:
            config_data = json.load(config_file)
            Your_ochki = config_data.get('Your_ochki', {})
            Attributes = config_data.get('Attributes', [0, 0, 0, 0])
    except FileNotFoundError:
        pass

def save_variables():
    config_data = {
        'Your_ochki': Your_ochki,
        'Attributes': Attributes
    }
    with open('config.json', 'w') as config_file:
        json.dump(config_data, config_file)


intents = disnake.Intents.default()
intents.message_content = True


bot = commands.Bot(command_prefix="-", intents=intents)

Your_ochki = {}
Attributes = [0, 0, 0, 0]  # Список значений для Speed, Sila, Magic, Prochka


@bot.event
async def on_ready():
    print(f"Бот подключен как {bot.user.name}")
    cursor.execute('SELECT (user_id, score, Speed, Strength, Magic, Toughness) FROM user_scores')
    data = cursor.fetchall()
    for user_id, score, Speed, Strength, Magic, Toughness in data:
        Your_ochki[user_id] = score
        Attributes = [Speed, Strength, Magic, Toughness]

    
    load_variables()

@bot.command()
async def ping(ctx):
    await ctx.send("Pong!")


@bot.command()
async def stats(ctx, member: disnake.Member = None):
    if member is None:
        member = ctx.author  # Если не указан участник, используем вызывающего пользователя

    member_name = member.display_name if member.nick else member.name  # Получаем отображаемое имя, учитывая nickname

    embed = disnake.Embed(title=f"Статистика персонажа {member_name}", color=0x000000)  # Черный цвет
    embed.add_field(name="Очки улучшений", value=f"💎 {Your_ochki.get(ctx.author.id, 0)}", inline=False)  # Эмодзи для очков
    embed.add_field(name="Скорость", value=f"⚡ {Attributes[0]}", inline=False)  # Эмодзи для скорости
    embed.add_field(name="Сила", value=f"💪 {Attributes[1]}", inline=False)  # Эмодзи для силы
    embed.add_field(name="Владение магией", value=f"✨ {Attributes[2]}", inline=False)  # Эмодзи для магии
    embed.add_field(name="Прочка", value=f"🛡️ {Attributes[3]}", inline=False)  # Эмодзи для прочности

    await ctx.send(embed=embed)


@bot.command()
@commands.has_permissions(manage_guild=True)
async def add_ochki(ctx, member: disnake.Member, amount: int):
    if not isinstance(member, disnake.Member):
        await ctx.send("Вы должны упомянуть участника сервера.")
        return

    if amount == 0:
        await ctx.send("Вы не можете добавить 0 очков.")
        return


    member_id = member.id
    cursor.execute('SELECT score FROM user_scores WHERE user_id = ?', (member_id,))
    current_score = cursor.fetchone()

    if current_score is None:
        current_score = 0
    else:
        current_score = current_score[0]

    new_score = current_score + amount

   
    cursor.execute('INSERT OR REPLACE INTO user_scores (user_id, score) VALUES (?, ?)', (member_id, new_score))
    conn.commit()


    Your_ochki[member_id] = new_score

   
    success_embed = disnake.Embed(title="Успешное добавление очков",
                                  description=f"Добавлено {amount} очков {member.mention}. "
                                              f"Текущее количество очков: {new_score}",
                                  color=0x00FF00)

    await ctx.send(embed=success_embed)


@bot.command()
async def upgrade(ctx, attribute: str, amount: int):
    global Your_ochki, Attributes

    
    error_embed = disnake.Embed(title="Ошибка", description=f"У вас не хватает очков для улучшения '{attribute}'.",
                                color=0xFF0000)

   
    user_score = Your_ochki.get(ctx.author.id, 0)

   
    if user_score >= amount:
        if attribute.lower() == "скорость":
            Attributes[0] += amount
        elif attribute.lower() == "сила":
            Attributes[1] += amount
        elif attribute.lower() == "владение магией":
            Attributes[2] += amount
        elif attribute.lower() == "прочка":
            Attributes[3] += amount

        Your_ochki[ctx.author.id] -= amount

       
        cursor.execute('UPDATE user_scores SET score = ?, Speed = ?, Strength = ?, Magic = ?, Toughness = ? WHERE user_id = ?',
                       (Your_ochki[ctx.author.id], Attributes[0], Attributes[1], Attributes[2], Attributes[3], ctx.author.id))

        conn.commit()

      
        upgrade_embed = disnake.Embed(title="Улучшение характеристики",
                                      description=f"Характеристика '{attribute}' улучшена на {amount} очков. "
                                                  f"Текущие характеристики:\n"
                                                  f"Скорость: {Attributes[0]}\n"
                                                  f"Сила: {Attributes[1]}\n"
                                                  f"Владение магией: {Attributes[2]}\n"
                                                  f"Прочка: {Attributes[3]}\n"
                                                  f"Осталось очков: {Your_ochki[ctx.author.id]}",
                                      color=0x00FF00)

        save_variables()  

        await ctx.send(embed=upgrade_embed)
    else:
        await ctx.send(embed=error_embed)
This code must store 5 variables in it. Also output embed where it is written with the command. Please help if you can


RE: Answer for newbie, Sqlite3 - buran - Sep-25-2023

Check the db file, maybe the table was created initially without Speed column?


RE: Answer for newbie, Sqlite3 - noisefloor - Sep-27-2023

Hello,

please post the full stack trace of the error you get so we can see where the error occurs.

Regards, noisefloor