Ошибка с выбором пользователей sqlite3

System

Новичок
Пользователь
Мар 11, 2022
14
0
1
Main:
Python:
@bot.message_handler(content_types = ['text', 'photo'])
def userchating(message):
    if message.chat.type == 'private':
        if message.text == '🚀Добавитись в БД🚀':
            adduser(message)
        elif message.text == '🚀Видалитись з БД🚀':
            removeuser(message)
        else db.user_exists(message.from_user.id):

            userlist = db.selectuser(message.from_user.id)
            sended = 0
            for user in userlist:
                if user[0] == message.from_user.id: pass
                else:
                    try:
                        if message.photo:
                            bot.send_photo(user[0], message.photo[0].file_id)
                        elif message.text:
                            bot.send_message(user[0], message.text)
                        sended+=1
                    except Exception as e: print(f"[Error] {e}")
                    bot.send_message(message.from_user.id, f"Відправлено {sended} повідомлень!")
    else:
        pass
БД:
Код:
import sqlite3

class Database:
    def __init__(self, database_file):
        self.connection = sqlite3.connect(database_file, check_same_thread = False)
        self.cursor = self.connection.cursor()

    def add_user(self, chat_id, username):
        with self.connection:
            return self.cursor.execute("INSERT INTO `userchat` (`chat_id`, `username`) VALUES (?,?)", (chat_id, username,))

    def selectuser(self, chat_id):
        with self.connection:
            return self.cursor.execute("SELECT `chat_id` FROM `userchat` WHERE `chat_id` = ?", (chat_id,)).fetchall()
            #return self.cursor.execute("SELECT `chat_id` FROM `userchat` WHERE `chat_id` = ?", (chat_id,)).fetchall()
            #return self.cursor.execute("SELECT * FROM `userchat` WHERE `chat_id` = ?", (chat_id,)).fetchall()

    def user_exists(self, chat_id):
        with self.connection:
            result = self.cursor.execute("SELECT `chat_id` FROM `userchat` WHERE `chat_id` = ?", (chat_id,)).fetchmany(1)
            #result = self.cursor.execute("SELECT * FROM `userchat` WHERE `chat_id` = ? AND `username` = ?",(chat_id,username,)).fetchmany(1)
            return bool(len(result))

    def remove_user(self, chat_id, username):
        with self.connection:
            return self.cursor.execute("DELETE FROM `userchat` WHERE `chat_id` = ? AND `username` = ?",(chat_id,username,)).fetchmany(1)

Сам код я ещё не чистил, но вообщем...
Бот должен отправлять сообщение от одного пользователя - всем, кто есть в таблице БД, кроме себя. При вводе в него любого сообщения - отправляет его ВСЕМ.
1648663134495.png

Хотелось бы узнать, как можно починить def selectuser, а также идеи об улучшение кода.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 677
479
83
ваш пример не воспроизводим, но если я не ошибаюсь, вы в функции selectuser берете только одного пользователя, который собственно и отправил сообщение...
вам нужно получить всех пользователей, то есть так
Python:
def selectuser(self):
     with self.connection:
           return self.cursor.execute("SELECT `chat_id` FROM `userchat`").fetchall()
и уже по этому делать цикл for и сравнение...


по улучшению, первое что бросилось в глаза, можно написать так
Python:
...
            for user in userlist:
                if user[0] != message.from_user.id:
                    try:
                        if message.photo:
                            bot.send_photo(user[0], message.photo[0].file_id)
                        elif message.text:
                            bot.send_message(user[0], message.text)
                        sended+=1
                    except Exception as e: print(f"[Error] {e}")
                    bot.send_message(message.from_user.id, f"Відправлено {sended} повідомлень!")
...
 

System

Новичок
Пользователь
Мар 11, 2022
14
0
1
ваш пример не воспроизводим, но если я не ошибаюсь, вы в функции selectuser берете только одного пользователя, который собственно и отправил сообщение...
вам нужно получить всех пользователей, то есть так
Python:
def selectuser(self):
     with self.connection:
           return self.cursor.execute("SELECT `chat_id` FROM `userchat`").fetchall()
и уже по этому делать цикл for и сравнение...


по улучшению, первое что бросилось в глаза, можно написать так
Python:
...
            for user in userlist:
                if user[0] != message.from_user.id:
                    try:
                        if message.photo:
                            bot.send_photo(user[0], message.photo[0].file_id)
                        elif message.text:
                            bot.send_message(user[0], message.text)
                        sended+=1
                    except Exception as e: print(f"[Error] {e}")
                    bot.send_message(message.from_user.id, f"Відправлено {sended} повідомлень!")
...
1648665473053.png

Теперь уже две строки, отдельно для себе, и всех других
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 677
479
83
выведите из if и из for строку bot.send_message(message.from_user.id, f"Відправлено {sended} повідомлень!")
Python:
...
for user in userlist:
    if user[0] != message.from_user.id:
        try:
            if message.photo:
                bot.send_photo(user[0], message.photo[0].file_id)
            elif message.text:
                bot.send_message(user[0], message.text)
            sended+=1
        except Exception as e: print(f"[Error] {e}")
bot.send_message(message.from_user.id, f"Відправлено {sended} повідомлень!")
...

плюс у вас не отрабатывает условие, посмотрите что в userlist и в user, возможно, вы сравниваете не тот элемент...
 
Последнее редактирование:

Форум IT Специалистов