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