@Dezzly

Почему не добавляется id пользователя из телеграм бота в sqlitestudio?

import logging
from aiogram import Bot, Dispatcher, executor, types
from db import Database
from config import TOKEN
import sqlite3

logging.basicConfig(level=logging.INFO)

bot = Bot(token=TOKEN)
dp = Dispatcher(bot)
db = Database('database.db')

@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    user_id = message.from_user.id
    logging.info(f"Получена команда /start от пользователя {user_id}")

    if message.chat.type == 'private':
        logging.info(f"Чат является приватным, продолжаем обработку...")
        try:
            logging.info(f"Попытка добавить пользователя {user_id} в базу данных...")
            user_added = db.add_user(user_id)
            if user_added:
                logging.info(f"Пользователь {user_id} успешно добавлен.")
            else:
                logging.info(f"Пользователь {user_id} не был добавлен (возможно, уже существует).")
        except sqlite3.IntegrityError:
            logging.info(f"Пользователь {user_id} уже существует.")
        finally:
            logging.info(f"Попытка получить данные пользователя {user_id}...")
            user = db.get_user(user_id)
            logging.info(f"Полученные данные пользователя: {user}")

        await bot.send_message(user_id, "Добро пожаловать!")
        logging.info(f"Обработка команды /start завершена для пользователя {user_id}")
    else:
        logging.info(f"Чат не является приватным, команда /start игнорируется.")

if __name__ == "__main__":
    try:
        executor.start_polling(dp, skip_updates=True)
    finally:
        db.close_connection()


База данных
import sqlite3
import traceback

class Database:
    def __init__(self, db_file):
        self.db_file = db_file
        self.connection = None
        self.cursor = None
        self.open_connection()  # Открываем соединение здесь
        self.create_table() # Создаем таблицу
        print("Объект базы данных создан.")

    def open_connection(self):
        """Открывает соединение с базой данных, если оно ещё не открыто."""
        print("Попытка открыть соединение с базой данных...")
        if self.connection is None:
            try:
                self.connection = sqlite3.connect(self.db_file)
                self.cursor = self.connection.cursor()
                print(f"Соединение с базой данных '{self.db_file}' установлено.")
            except Exception as e:
                print(f"Ошибка при подключении к базе данных: {e}")
                traceback.print_exc()
                raise
        else:
            print("Соединение с базой данных уже открыто.")

    def __del__(self):
        """Закрывает соединение при удалении объекта."""
        self.close_connection()

    def create_table(self):
        """Создаёт таблицу `users`, если её не существует."""
        print("Попытка создать таблицу 'users'...")
        self.open_connection()
        try:
            self.cursor.execute("""
                CREATE TABLE IF NOT EXISTS users (
                    id INTEGER PRIMARY KEY,
                    user_id INTEGER UNIQUE
                )
            """)
            self.connection.commit()
            print("Таблица 'users' создана или уже существует.")
            self.cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='users'")
            if self.cursor.fetchone():
                print("Таблица 'users' найдена в базе данных.")
            else:
                print("Таблица 'users' НЕ НАЙДЕНА в базе данных!") 
        except Exception as e:
            print(f"Ошибка при создании таблицы 'users': {e}")
            traceback.print_exc()  
            raise  # Проброс исключения для остановки приложения

    def user_exists(self, user_id):
        """Проверяет, существует ли пользователь в базе данных."""
        print(f"Проверка существования пользователя с ID {user_id}...")
        self.open_connection()
        try:
            result = self.cursor.execute("SELECT 1 FROM users WHERE user_id = ?", (user_id,)).fetchone() # Убрали кавычки
            exists = bool(result)
            print(f"Пользователь с ID {user_id} существует: {exists}")
            return exists
        except Exception as e:
            print(f"Ошибка при проверке существования пользователя: {e}")
            traceback.print_exc()
            raise

    def get_user(self, user_id):
        """Получает пользователя из базы данных."""
        print(f"Попытка получить пользователя с ID {user_id}...")
        self.open_connection()
        try:
            print(f"SQL запрос: SELECT * FROM 'users' WHERE 'user_id' = {user_id}")  # Вывод запроса в консоль
            result = self.cursor.execute("SELECT * FROM users WHERE user_id = ?", (user_id,)).fetchone()
            print(f"Результат запроса: {result}")
            return result
        except Exception as e:
            print(f"Ошибка при получении пользователя из базы данных: {e}")
            traceback.print_exc()  
            raise  # Проброс исключения для остановки приложения

    def add_user(self, user_id):
        """Добавляет пользователя в базу данных, если его там ещё нет."""
        print(f"Попытка добавить пользователя с ID {user_id}...")
        if self.user_exists(user_id):
            print(f"Пользователь с ID {user_id} уже существует.")
            return False
        self.open_connection()
        try:
            self.cursor.execute("INSERT INTO users (user_id) VALUES (?)", (user_id,))
            self.connection.commit()  
            print("Данные сохранены в БД")  
            return True
        except Exception as e:
            print(f"Ошибка при добавлении пользователя в базу данных: {e}")
            traceback.print_exc()
            return False

    def close_connection(self):
        """Закрывает соединение с базой данных."""
        print("Попытка закрыть соединение с базой данных...")
        if self.connection:
            try:
                self.connection.close()
                print("Соединение с базой данных закрыто.")
            except Exception as e:
                print(f"Ошибка при закрытии соединения с базой данных: {e}")
                traceback.print_exc()  
                raise  
        else:
            print("Соединение с базой данных не открыто.")


Консоль:

Попытка открыть соединение с базой данных...
Соединение с базой данных 'database.db' установлено.
Попытка создать таблицу 'users'...
Попытка открыть соединение с базой данных...
Соединение с базой данных уже открыто.
Таблица 'users' создана или уже существует.
Таблица 'users' найдена в базе данных.
Объект базы данных создан.
INFO:aiogram:Bot: test [@fwefwegfweg_bot]
WARNING:aiogram:Updates were skipped successfully.
INFO:aiogram.dispatcher.dispatcher:Start polling.
INFO:root:Получена команда /start от пользователя 1966823506
INFO:root:Чат является приватным, продолжаем обработку...
INFO:root:Попытка добавить пользователя 1966823506 в базу данных...
Попытка добавить пользователя с ID 1966823506...
Проверка существования пользователя с ID 1966823506...
Попытка открыть соединение с базой данных...
Соединение с базой данных уже открыто.
Пользователь с ID 1966823506 существует: True
Пользователь с ID 1966823506 уже существует.
INFO:root:Пользователь 1966823506 не был добавлен (возможно, уже существует).
INFO:root:Попытка получить данные пользователя 1966823506...
Попытка получить пользователя с ID 1966823506...
Попытка открыть соединение с базой данных...
Соединение с базой данных уже открыто.
SQL запрос: SELECT * FROM 'users' WHERE 'user_id' = 1966823506
Результат запроса: (1, 1966823506)
INFO:root:Полученные данные пользователя: (1, 1966823506)
INFO:root:Обработка команды /start завершена для пользователя 1966823506
666f5f529e4a9617771001.png666f5f598ea3a144632900.png

666f4cbe69c9e184833250.png
  • Вопрос задан
  • 65 просмотров
Решения вопроса 1
trapwalker
@trapwalker
Программист, энтузиаст
Похоже ваш лог не соответствует коду. Посмотрите где вызывается add_user. Там обрабатывается исключение IntegrityError, но оно жеперехватывается и не рерайсится в самой функции add_user. Это значит, что строка
logging.info(f"Пользователь {message.from_user.id} уже существует.")

не может быть исполнена.
add_user у вас вообще не бросит IntegrityError. Возвращаемое значение False никак не обрабатывается.
Но какие-то щдругие исключения вы не пытаетесь поймать и залогировать. Нужно логгировать все исключения.
В общем, нужно больше логов и аккуратнее с обработкой исключений.

Вообще, если что-то идёт не так, нужно сразу и обязательно падать и детально выдавать инфу об ошибке.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы