такая ошибка TypeError: Database() takes no arguments
Пытаюсь разобраться с базой для telegram бота.
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,'Укажите ваш ник')
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, 'Что?')
после запуска, выводит такую ошибку.
TypeError: Database() takes no arguments
почему так не понимаю. делал все по гайду
код базы данных
import sqlite3
class Database:
def __unit__(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))
Ошибку я исправил. теперь код такой.
logging.basicConfig(level=logging.INFO)
bot = Bot(token=TOKEN_API)
dp = Dispatcher(bot)
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,'Укажите ваш ник')
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)
для базы данных
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))
вот что на выходе
Process finished with exit code 0
ошибка была тут
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
теперь ругается
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
такой ошибкой
return signup
UnboundLocalError: local variable 'signup' referenced before assignment
если сдвинуть вправо return signup не ругается, но бот на ввод ника отвечает что?, ну и базу данных не записывает ник.
Источник: Stack Overflow на русском