Задать вопрос
Kemper5454
@Kemper5454

TypeError: 'NoneType' object is not iterable, что делать?

На стадии ввода имени в тг боте выдает ошибку:
for row in result:
TypeError: 'NoneType' object is not iterable

Код db:
import sqlite3
class Database:
    def __init__(self, db_file):
        self.connection = sqlite3.connect(db_file)
        self.cursor = self.connection.cursor()
    def add_user(self, user_id):
        with self.connection:
             return self.cursor.execute("INSERT INTO 'users' ('user_id') VALUES (?)",(user_id,))

    def user_exist(self, user_id):
        with self.connection:
            result = self.cursor.execute("SELECT * FROM 'users' WHERE 'user_id' = ?",(user_id,)).fetchall()
            return bool(len(result))

    def set_nickname(self,user_id,nickname):
        with self.connection:
            return self.cursor.execute("UPDATE 'users' SET 'nickname' = ? WHERE 'user_id' = ?",(nickname,user_id))

    def get_signup(self,user_id):
        with self.connection:
            result = self.cursor.execute("SELECT 'signup' FROM 'users' WHERE 'user_id' = ?", (user_id,)).fetchone()
            for row in result:
                signup = str(row[0])
                return signup

    def set_signup(self,user_id, signup):
        with self.connection:
            return self.cursor.execute("UPDATE 'users' SET 'signup' = ? WHERE 'user_id' = ?",(signup,user_id))


Код main:
import logging
from aiogram import Bot, Dispatcher, executor, types
import markups as nav
from db import Database

TOKEN = "5103821559:AAGL20hGYw8wUvBdu7u_vNeUQlhVxjmQIQs"

logging.basicConfig(level = logging.INFO)

bot = Bot(token = TOKEN)
dp = Dispatcher(bot)

db = Database('database.db')

@dp.message_handler(commands = ['start'])
async def start(message: types.Message):
    if(not db.user_exist(message.from_user.id)):
        db.add_user(message.from_user.id)
        await bot.send_message(message.from_user.id, "Укажите ваш ник")
    else:
        await bot.send_message(message.from_user.id, "Вы уже зарегистрированы", reply_markup = nav.mainMenu)

@dp.message_handler()
async def bot_message(message: types.Message):
    if message.chat.type == 'private':
        if message.text == 'Профиль':
            pass
        else:
            if db.get_signup(message.from_user.id) == "setnickname":
                if len(message.text) > 15:
                    await bot.send_message(message.from_user.id, "Никнейм не должен превышать 15 символов")
                elif '@' in message.text or '/' in message.text:
                    await bot.send_message(message.from_user.id, "Вы ввели запрещеный символ")
                else:
                    db.set_nickname(message.from_user.id, message.text)
                    db.set_signup(message.from_user.id, "done")
                    await bot.send_message(message.from_user.id, "Регистрация прошла успешно", reply_markup = nav.mainMenu)
            else:
                await bot.send_message(message.from_user.id, "Я не понял")

if __name__ == "__main__":
    executor.start_polling(dp, skip_updates = True)
  • Вопрос задан
  • 3404 просмотра
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillbox
    Профессия Python-разработчик + ИИ
    10 месяцев
    Далее
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Включить голову и прочитать уже документацию по fetchone().
Fetches the next row of a query result set, returning a single sequence, or None when no more data is available.

В get_signup() не находит такое значение в базе, в выдаче 0 строк, так что fetchone() возвращает None, который ты ничтоже сумнящеся скармливаешь циклу for.
И вообще у тебя фигня творится с методом get_signup().
С чего ты взял, что он вернёт строку "setnickname"?
Зачем ты делаешь for row in result если result - это результат вызова fetchone(), т.е. либо строка, либо None?
Почему при получении сообщения не предусмотрено что пользователя может тупо не быть в базе? Например, он не писал /start, а сразу написал сообщение, или базу потерли, или ещё что.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Краснодар
от 220 000 до 300 000 ₽
ITK academy Краснодар
от 75 000 ₽
DimaTech Ltd Краснодар
от 140 000 до 140 000 ₽