Такая ошибка UnboundLocalError: local variable 'signup' referenced before assignment
Продолжаю разбираться с базой данных для telegram бота.
logging.basicConfig(level=logging.INFO)
bot = Bot(token=TOKEN_API)
dp = Dispatcher(bot)
btnProfile = KeyboardButton('/Profile')
btnSub = KeyboardButton("/Sub")
mainMenu = ReplyKeyboardMarkup(resize_keyboard=True)
mainMenu.add(btnProfile, btnSub)
db=Database('database.db')
@dp.message_handler(commands=['start'])
async def start(message:types.Message):
if (not db.user_exists(message.from_user.id)):
db.add_user(message.from_user.id)
await bot.send_message(message.from_user.id,'Укажите ваш ник',reply_markup=mainMenu)
else:
await bot.send_message(message.from_user.id, 'Вы уже зарегестрированы',reply_markup=mainMenu)
@dp.message_handler()
async def bot_message(message: types.Message):
if message.chat.type=='private':
if message.text=='/Profile':
user_nickname = 'Ваш ник' + db.get_nickname(message.from_user.id)
await bot.send_message(message.from_user.id, user_nickname)
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=mainMenu)
else:
await bot.send_message(message.from_user.id, 'Что?')
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
выдает ошибку UnboundLocalError: local variable 'signup' referenced before assignment
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_exists(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,)).fetchall()
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))
def get_nickname(self, user_id):
with self.connection:
result = self.cursor.execute("SELECT 'nickname' FROM 'users' WHERE 'user_id'=?", (user_id,)).fetchall()
for row in result:
nickname = str(row[0])
return nickname
При это если сдвинуть в право, то ошибки не будет. Но бот правильно работать н станет. Ник который вводиться по прежнему не записывается в базу данных. Плюс к этому может записывает одного и того же пользователя (user_id) на новую строчку, и не выводит что пользователь уже зарегистрирован.
Т.е условие не отрабатывает как надо.
if (not db.user_exists(message.from_user.id)):
db.add_user(message.from_user.id)
await bot.send_message(message.from_user.id,'Укажите ваш ник',reply_markup=mainMenu)
else:
await bot.send_message(message.from_user.id, 'Вы уже зарегестрированы',reply_markup=mainMenu)
после вывода 'Укажите ваш ник', и введения ника сразу выдает Что?
await bot.send_message(message.from_user.id, 'Что?')