@lolSaByR

Как исправить ошибку discord.py?

Доброго времени суток!
Недавно я начал писать бота, используя библиотеку discord.py, а также используя базу данных sqlite3.

Запуская бота, консоль выводит данную ошибку:

Ignoring exception in command __balance:
Traceback (most recent call last):
  File "/home/sabyr/.local/lib/python3.8/site-packages/discord/ext/commands/core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "/home/sabyr/discord.py/bot.py", line 48, in __balance
    description = f"""Баланс пользователя **{ctx.author}** составляет **{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]} :leaves:**"""
TypeError: 'NoneType' object is not subscriptable

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/sabyr/.local/lib/python3.8/site-packages/discord/ext/commands/bot.py", line 903, in invoke
    await ctx.command.invoke(ctx)
  File "/home/sabyr/.local/lib/python3.8/site-packages/discord/ext/commands/core.py", line 859, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "/home/sabyr/.local/lib/python3.8/site-packages/discord/ext/commands/core.py", line 94, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: 'NoneType' object is not subscriptable


Код:

import discord
from discord.ext import commands

import sqlite3
from config import settings

client = commands.Bot(command_prefix = settings['PREFIX'])
client.remove_command('help')

connection = sqlite3.connect('server.db')
cursor = connection.cursor()


@client.event
async def on_ready():
    cursor.execute("""CREATE TABLE IF NOT EXISTS users (
        name TEXT,
        id INT,
        cash BIGINT,
        rep INT,
        lvl INT
    )""")

    for guild in client.guilds:
        for member in guild.members:
            if cursor.execute(f"SELECT id FROM users WHERE id = {member.id}").fetchone() is None:
                cursor.execute(f"INSERT INTO users VALUES ('{member}', {member.id}, 0, 0, 0)")
            else:
                pass

    connection.commit()
    print('BOT Connected')


@client.event
async def on_member_join(member):
    if cursor.execute(f"SELECT id FROM users WHERE id = {member.id}").fetchone() is None:
        cursor.execute(f"INSERT INTO users VALUES ('{member}', {member.id}, 0, 0, 0")
        connection.commit()
    else:
        pass


@client.command(aliases = ['balance', 'cash', 'bal'])
async def __balance(ctx, member: discord.Member = None):
    if member is None:
        await ctx.send(embed = discord.Embed(
        description = f"""Баланс пользователя **{ctx.author}** составляет **{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]} :leaves:**"""
        ))
    else:
        await ctx.send(embed = discord.Embed(
        description = f"""Баланс пользователя **{member}** составляет **{cursor.execute("SELECT cash FROM users WHERE id = {}".format(member.id)).fetchone()[0]} :leaves:**"""
        ))
    

client.run(settings['TOKEN'])
  • Вопрос задан
  • 588 просмотров
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
Во-первых, фигачить cursor.execute() прямо в f-строку - это очень, очень плохая идея. За такое бьют по пальцам.
Во-вторых, not subscriptable означает, что ты пытаешься обратиться по индексу (типа x[0]) в то время как объект (x) - это None.
90% шанс что это вызов .fetchone()[0] - запрос к базе не находит нужную строку, тогда fetchone() возвращает None, а дальше попытка получить индекс от None генерирует исключение.

Никогда, НИКОГДА не пиши в f-строках выражение сложнее чем 2*2. Вынеси промежуточный результат в переменную, проверь её значение на корректность, затем уже используй.
Ответ написан
Комментировать
@AineD3V
Нонтайп объект не подписан на вас
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы