Ошибка типа: объект ‘NoneType’ не является итеративным — SQLite и discord.py

#python #sqlite #discord

#python #sqlite #Discord

Вопрос:

Функция проверит, является ли канал с реакцией частным каналом между ботом и пользователем, а затем выполнит другие действия.

Кодекс:

 @bot.event
async def on_raw_reaction_add(payload):
    channel = bot.get_channel(payload.channel_id)
    msg = await channel.fetch_message(payload.message_id)
    emoji = payload.emoji
    author = payload.member
    if emoji.is_custom_emoji():
        emoji_count = discord.utils.get(msg.reactions, emoji=emoji).count
    else:
        emoji_count = discord.utils.get(msg.reactions, emoji = emoji.name).count
    cur.execute(f"SELECT discord_user_dmchannel_id FROM users WHERE discord_user_id = 
                   {int(payload.user_id)};")
    print(cur.fetchone())
    channel_dm_id_list = list(cur.fetchone())
    channel_dm_id = channel_dm_id_list[0]
    if payload.channel_id == channel_dm_id:
        if int(emoji_count) > 1:
            if emoji = ...
 

На выходе:

  (782664385889959976,)
 Ignoring exception in on_raw_reaction_add
 Traceback (most recent call last):
 File "C:UsersplaysAppDataLocalProgramsPythonPython38-32libsite-packagesdiscordclient.py", 
 line 312, in _run_event
 await coro(*args, **kwargs)
 File "C:UsersplaysOneDriveРабочий столPythonbot2.py", line 130, in on_raw_reaction_add
 channel_dm_id_list = list(cur.fetchone())
 TypeError: 'NoneType' object is not iterable
 

Столбцы таблицы:

 users(
discord_user_id INT PRIMARY KEY,
discord_user_dmchannel_id INT,
discord_user_name TEXT,
... 
...);
 

Комментарии:

1. Возвращает ли fetchone возврат None , если результатов нет?

Ответ №1:

fetchone() возвращает следующую строку. В строке print(cur.fetchone()) вы уже получаете первую строку. В следующей строке channel_dm_id_list = list(cur.fetchone()) вы пытаетесь получить второе значение. Но поскольку второго значения нет, метод возвращает None, что вызывает вашу ошибку. Так что либо удалите инструкцию print, либо сохраните первый результат таким образом:

 channel_dm_id_list = list(cur.fetchone())
print(channel_dm_id_list)