Что означает ошибка AioGram 2.0: TypeError: 'NoneType' object is not subscriptable и как её исправить?

Код должен извлекать информацию о пользователе из базы данных и определять соответствующее сообщение, однако возникла ошибка. <br/> <br/> Код: <br/> <pre><code class="python">user_id = callback.message.from_user.id
cursor.execute("SELECT subs_chanel FROM users_quests WHERE user_id = ?", (user_id,))
subs = cursor.fetchone()
count_subs = subs[0]
if count_subs == 'NO':
    if callback.message.chat.type == 'private':
        user_id = callback.from_user.id
        if await check_sub_channels(cfg.CHANNELS, callback.message.from_user.id):
            cursor.execute("UPDATE users SET earns = earns + 4 WHERE user_id = ?", (user_id,))
            cursor.execute("UPDATE users_quests SET subs_chanel = subs_chanel + 1 WHERE user_id = ?", (user_id,))
            await bot.edit_message_caption(
    chat_id=callback.message.chat.id,
    message_id=callback.message.message_id,
    caption=f' Здравствуй! {callback.from_user.first_name}\n\n Спасибо за вашу поддержку!\n Вам было начислено 4 звезды.',
    reply_markup=backing)
        else:
            await bot.edit_message_caption(
    chat_id=callback.message.chat.id,
    message_id=callback.message.message_id,caption=f" Здравствуй! {callback.from_user.first_name}\n\n Вы не подписались на все каналы.", reply_markup=subing_channels)
elif count_subs == 'YES':
    await bot.edit_message_caption(
        chat_id=callback.message.chat.id,
        message_id=callback.message.message_id,
        caption=f" Здравствуй! {callback.from_user.first_name}\n\n Вы уже выполнили данное задание.",
        reply_markup=backing)
elif count_subs == 'NONE':
    await bot.send_message(callback.message.chat.id, 'Ошибка.\n\nСообщите администрации 
  • 19 апреля 2025 г. 10:25
Ответы на вопрос 2
Ошибка `TypeError: 'NoneType' object is not subscriptable` возникает, когда вы пытаетесь выполнить доступ к элементу, используя квадратные скобки (например, `subs[0]`), но объект, к которому вы пытаетесь обратиться, имеет значение `None`. В вашем случае это происходит из-за того, что запрос к базе данных `SELECT subs_chanel FROM users_quests WHERE user_id = ?` не возвращает ни одной строки, и результатом работы `cursor.fetchone()` является `None`.

Чтобы исправить эту ошибку, вам нужно проверить, что результат не является `None`, прежде чем пытаться обращаться к его элементам. Вот модифицированный фрагмент вашего кода с необходимыми проверками:

```python
user_id = callback.message.from_user.id
cursor.execute("SELECT subs_chanel FROM users_quests WHERE user_id = ?", (user_id,))
subs = cursor.fetchone()

# Проверяем, что subs не равно None
if subs is None:
    await bot.send_message(callback.message.chat.id, 'Ошибка. Пожалуйста, напишите администрации.')
else:
    count_subs = subs[0]
    if count_subs == 'NO':
        if callback.message.chat.type == 'private':
            user_id = callback.from_user.id
            if await check_sub_channels(cfg.CHANNELS, callback.message.from_user.id):
                cursor.execute("UPDATE users SET earns = earns + 4 WHERE user_id = ?", (user_id,))
                cursor.execute("UPDATE users_quests SET subs_chanel = subs_chanel + 1 WHERE user_id = ?", (user_id,))
                await bot.edit_message_caption(
                    chat_id=callback.message.chat.id,
                    message_id=callback.message.message_id,
                    caption=f'Здравствуй! {callback.from_user.first_name}\n\nСпасибо за вашу поддержку!\nВам было начислено 4 звезды.',
                    reply_markup=backing)
            else:
                await bot.edit_message_caption(
                    chat_id=callback.message.chat.id,
                    message_id=callback.message.message_id,
                    caption=f"Здравствуй! {callback.from_user.first_name}\n\nВы не подписались на все каналы.",
                    reply_markup=subing_channels)
    elif count_subs == 'YES':
        await bot.edit_message_caption(
            chat_id=callback.message.chat.id,
            message_id=callback.message.message_id,
            caption=f"Здравствуй! {callback.from_user.first_name}\n\nВы уже выполнили данное задание.",
            reply_markup=backing)
    elif count_subs == 'NONE':
        await bot.send_message(callback.message.chat.id, 'Ошибка.\n\nСообщите администрации.')
```

В этом изменённом коде перед обращением к элементам `subs` сначала проверяется, есть ли данные в выборке (`if subs is None`). Таким образом, вы избежите ошибки, когда `subs` равно `None`.
Сначала учим основы языка, потом пишем ботов, тебе вот явно написали что у тебя в subs None, т.е. в users_quests нет записи с этим user_id
Похожие вопросы