Почему row[0] обращается к None объекту?

Ссылка скопирована
1 ответ
@commands.Cog.listener() async def on_dropdown(self, inter: disnake.MessageInteraction):     c = self.conn.cursor()     c.execute(f"SELECT role_id, cost FROM shop WHERE id = ?", (inter.data['values'][0],))     row = c.fetchone()     role = inter.guild.get_role(row[0])     if role in inter.author.roles:         embed = disnake.Embed(title="Магазин ролей", description=f"У вас уже есть роль {role}", color=0xFF0000)         await inter.response.send_message(embed=embed, ephemeral=True)         return     if c.execute(f"SELECT cash FROM users WHERE id = {inter.author.id}") < row[1]:         embed = disnake.Embed(title="Магазин ролей", description=f"У вас недостаточно денег для покупки роли {role_name}", color=0xFF0000)         await inter.response.send_message(embed=embed, ephemeral=True)         return     else:         c.execute(f"UPDATE users SET cash = {c.execute(f'SELECT cash FROM users WHERE id = {inter.author.id}') - row[1]} WHERE id = {inter.author.id}")         self.conn.commit()         await inter.author.add_roles(role)         embed = disnake.Embed(title="Магазин ролей", description=f"Вы успешно приобрели роль {role}", color=0x2f3136)         await inter.response.send_message(embed=embed, ephemeral=True)

Дополнительно:

c.execute(f"UPDATE users SET cash = {c.execute(f'SELECT cash FROM users WHERE id = {inter.author.id}') - row[1]} WHERE id = {inter.author.id}")

Пожалуйста, не надо так делать. Вам что, по пальцу отрезают за каждую промежуточную переменную?
И не надо формировать запросы через f-строки, для этого есть подстановка параметров в запрос. Будет аккуратнее и безопаснее.

  • Vindicar, а разве из за этого код не будет работать? Вроде я про другую ошибку спрашивал
  • Reaper_sds, при таком подходе
    - очень легко словить ошибку или уязвимость в другом месте
    - выполняется два запроса, где хватило бы одного
    - становится тяжело прочитать код
    Лучше сразу приучиться делать как правильно.
  • Vindicar, это всё круто и я решил проблему с row[0] теперь у меня проблема с cost(row[2])
  • Reaper_sds, у тебя нету в коде вызова cost(row[2]), короче учи основы python, ботов тебе писать рано
  • Почему row[0] обращается к None объекту?

    Потому что в row None. А почему в row None? Потому что None вернул sql запрос. Элементарная же логика

    • эма ну ладно
    • и почему же вернул?:)
    • Reaper_sds, давай начнем дальше логически мыслить, наверно потому что записи с таким id нет в базе данных.
    • типа такой роли нету в базе данных?
    • типа я не сохранил эту роль в базу данных?
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Виктор Sys Ответ

    Проблема, с которой вы столкнулись, связана с тем, что вы пытаетесь обратиться к первому элементу (row[0]) объекта, который является None. None в Python представляет собой специальное значение, которое обозначает отсутствие значения. При попытке обращения к элементам объекта None вы получите ошибку, так как None не имеет индексов или атрибутов.

    Чтобы избежать ошибки при обращении к None объекту, необходимо предварительно проверить, что объект не является None, прежде чем обращаться к его элементам. Например, вы можете сделать проверку на None перед обращением к row[0]:

    if row is not None:
        value = row[0]
        # продолжайте выполнение кода
    else:
        # обработка случая, когда row равен None

    Таким образом, вы защитите свой код от ошибок, связанных с обращением к None объекту. Помните, что проверка на None является важной частью обработки данных в Python, чтобы избежать непредвиденных ситуаций и ошибок в вашем коде.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно