Некорректно работает конструкция if...else. Телеграм бот
Всегда срабатывает else, нужно чтобы выводилось сообщение вы не подписаны, в случае, если в таблице поле status == FALSE, у меня же всегда выводит все то, что в блоке else. Используется библиотека aiogram.
@dp.message_handler(commands=['unsubscribe'])
async def unsubscribe(message:types.Message):
if (db.subscriber_exists(message.from_user.id) == False):
print (db.get_status(message.from_user.id))
# если юзера нет в базе, добавляем с неактивной подпиской (запоминаем)
await message.answer("Вы не подписаны.")
else:
# если юзер есть в базе, то обновляем статус подписки
db.update_subscription(message.from_user.id, False)
#print (db.get_status(message.from_user.id))
await message.answer("Я тебе больше не нужен...")
await message.answer_sticker(r'CAACAgIAAxkBAAEBv8Vf-FRnpC5qrQZn2Qwt-rpBs-OJpwACDAEAAhZ8aAPEXuoz0922Fx4E')
await message.answer("прощай ?")
db
import sqlite3
class SQLighter:
def __init__(self, database):
"""Подключаемся к БД и сохраняем курсор соединения"""
self.connection = sqlite3.connect(database)
self.cursor = self.connection.cursor()
def get_subscriptions(self, status = True):
"""Получаем всех активных подписчиков бота"""
with self.connection:
return self.cursor.execute("SELECT * FROM `users` WHERE `status` = ?", (status,)).fetchall()
def subscriber_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 add_subscriber(self, user_id, status = True):
"""Добавляем нового подписчика"""
with self.connection:
return self.cursor.execute("INSERT INTO `users` (`user_id`, `status`) VALUES(?,?)", (user_id,status))
def update_subscription(self, user_id, status):
"""Обновляем статус подписки пользователя"""
with self.connection:
return self.cursor.execute("UPDATE `users` SET `status` = ? WHERE `user_id` = ?", (status, user_id))
def get_status(self, user_id):
"""получаем статус юзера"""
with self.connection:
result = self.cursor.execute("SELECT `status` FROM `users` WHERE `user_id` = ?", (user_id,)).fetchall()
return bool(len(result))
def close(self):
"""Закрываем соединение с БД"""
self.connection.close()
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Думаю, проверку нужно поменять на fetchone:
def subscriber_exists(self, user_id):
"""Проверяем, есть ли уже юзер в базе"""
with self.connection:
has = self.cursor.execute('SELECT 1 FROM `users` WHERE `user_id` = ?', (user_id,)).fetchone()
return bool(has)
UPD.
Если у вас подписчик определяется не только наличием в базе данных, но и статусом, то нужно это проверять (добавьте проверку status):
def subscriber_exists(self, user_id):
"""Проверяем, есть ли уже юзер в базе"""
with self.connection:
has = self.cursor.execute('SELECT 1 FROM `users` WHERE `user_id` = ? and `status` = 1', (user_id,)).fetchone()
return bool(has)
Или можно подписчика через статус проверять, но для этого нужно его правильно получать:
def get_status(self, user_id):
"""получаем статус юзера"""
with self.connection:
result = self.cursor.execute("SELECT `status` FROM `users` WHERE `user_id` = ?", (user_id,)).fetchone()
# Если юзер не был найден
if result is None:
return False
return bool(result[0])
Тогда, можно проверить статус так:
if not db.get_status(message.from_user.id):
await message.answer("Вы не подписаны.")
else:
...
PS.
И я бы еще условие упростил:
if not db.subscriber_exists(message.from_user.id):
print(db.get_status(message.from_user.id))
...