• Почему Телеграм-бот не находит в БД sqlite3 подписчика чтобы удалить?

    @Ross_F1 Автор вопроса
    Проблему решил, но пришлось почти заново начинать проект. Спасибо вот этому гайду - по нему переделывал обращения к БД и редактирование в ней.
    Я реализовал два метода удаления. По команде и по определённым словам. Вот какой код поучился, может кому полезно будет:
    import telebot
    from telebot import types
    import sqlite3
    from subscribers_db import SubscribersDB
    
    db = sqlite3.connect('subscribers.db', check_same_thread=False)
    cursor = db.cursor()
    
    cursor.execute("""CREATE TABLE IF NOT EXISTS subscribers(chatid TEXT)""")  # создаем таблицу users с полем chatid
    db.commit()
    
    bot = telebot.TeleBot('токен)
    
    def handle_stop_command(message):
        chatid = message.chat.id
    # Удаление пользователя из базы данных
        db = sqlite3.connect('subscribers.db')
        cursor = db.cursor()
        cursor.execute("DELETE FROM subscribers WHERE chatid=?", (chatid,))
        db.commit()
        db.close()
    
        # Отправка сообщения о том, что пользователь отписан
        bot.send_message(chatid, "Ви відписалися від бота. Щоб підписатися знову, скористайтесь командою /start.")
    
    # Обработчик команды /start
    ##  ...тут всякая стартовая фигня
    
    cursor.execute(f"SELECT chatid FROM subscribers WHERE chatid = '{message.chat.id}'") # проверяем, есть ли такая запись в таблице
        if cursor.fetchone() is None:  # если такой записи нет, то:
            cursor.execute(f"INSERT INTO subscribers VALUES(?)", (message.chat.id,))  # вставляем айди пользователя в таблицу subscribers
            bot.send_message(chatid, "Оберіть, що Вас цікавить")
            db.commit()  # сохраняем таблицу
        else:
            bot.send_message(chatid, "Ви вже підписані на бота. Оберіть, що Вас цікавить")
    
    # Обработчик для кнопки types.InlineKeyboardButton(" Відписатися", callback_data="stop")
    @bot.callback_query_handler(func=lambda call: call.data == "stop")
    def handle_stop_callback(call):
        chatid = call.message.chat.id
        # Удаление пользователя из базы данных
        db = sqlite3.connect('subscribers.db')
        cursor = db.cursor()
        cursor.execute("DELETE FROM subscribers WHERE chatid=?", (chatid,))
        db.commit()
        db.close()
    
        # Отправка сообщения о том, что пользователь отписан
        bot.send_message(chatid, "Ви відписалися від бота. Щоб підписатися знову, скористайтесь командою /start.")
    
    # Обработчик для удаления подписчика по словам
    @bot.message_handler(func=lambda message: message.text.lower() in ["стоп", "пнх", "stop", "Стоп", "Stop"])
    def check_subscriber_status(message):
        cursor.execute("SELECT chatid FROM subscribers WHERE chatid = ?", (message.chat.id,))
        user_exists = cursor.fetchone()
    
        if user_exists:
            cursor.execute("DELETE FROM subscribers WHERE chatid = ?", (message.chat.id,))
            db.commit()
            bot.send_message(message.chat.id, "Ви відписалися від бота. Щоб підписатися знову, скористайтесь командою /start.")
        else:
            bot.send_message(message.chat.id, "Ви не підписані на бота. Щоб підписатися, скористайтесь командою /start.")


    Спасибо всем за внимание. Это мой первый такой пост - раньше только гуглил и стеснялся обращаться за помощью. Теперь я понял, что сюда нужно более простые вопросы писать - а то что я хотел - это на фрилансе надо решать - ибо код надо глубоко и вдумчиво смотреть и беглые взгляды тут не помогут. Ну разве что гуру высочайшего уровня сможет так) Всем добра и мира!
  • Почему Телеграм-бот не находит в БД sqlite3 подписчика чтобы удалить?

    @Ross_F1 Автор вопроса
    Алексей, Кто же тогда я?) Если даже ты не новичок)) Ладно, спасибо. Как вариант заново писать код и потом понемного вставлять в него старые наработки
  • Почему Телеграм-бот не находит в БД sqlite3 подписчика чтобы удалить?

    @Ross_F1 Автор вопроса
    Попробовал изменить эту часть по Вашему совету
    def is_subscriber(self, chat_id):
            self.cursor.execute("SELECT chat_id FROM subscribers WHERE chat_id = ?", (chat_id,))
            subscriber = self.cursor.fetchone()
            return subscriber is not None

    но теперь выдаёт ошибку когда отправляю /start:
    line 35, in is_subscriber
    self.cursor.execute("SELECT chat_id FROM subscribers WHERE chat_id = ?", (chat_id,))
    sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread. The object was created in thread id 5360 and this is thread id 5268.
    Эта ошибка указывает на проблему с использованием объекта SQLite в разных потоках. Вот сижу дальше чешу репу)
  • Почему Телеграм-бот не находит в БД sqlite3 подписчика чтобы удалить?

    @Ross_F1 Автор вопроса
    В том и дело, что я не знаю в каком проблема. А два тега разместил для удобства