Как выполнить функцию подключения к базе с @router с класса?

Изучаю Python походу написания базы, такая ситуацию.
логика файлов:
app/handlers.py
app/classes.py
.env
run.py

в роутер handlers.py вызываю функцию для запроса в базу:
from dotenv import load_dotenv
from aiogram import Bot, Dispatcher

from app.handlers import router
from app.handlers_admin import admin
from app.classes import Database

@router.message()
async def add_user_data(message: Message, bot: Bot, db: Database):
    print(message.from_user)
    user_data = message.from_user
    db.upsert_user(
        user_id=user_data.id,
        is_bot=user_data.is_bot,
        first_name=user_data.first_name or "None",
        last_name=user_data.last_name or "None",
        username=user_data.username or "None",
        language_code=user_data.language_code or "None",
        is_premium=user_data.is_premium or False,
    )


Файл run.py
import asyncio
import logging
import os

from dotenv import load_dotenv
from aiogram import Bot, Dispatcher

from app.handlers import router
from app.handlers_admin import admin
from app.classes import Database


async def main():
    # Загружаем параметры
    load_dotenv()
    # Инициализируем базу данных
    db = Database(
        host=os.getenv("DB_HOST"),
        port=int(os.getenv("DB_PORT")),
        user=os.getenv("DB_USER"),
        password=os.getenv("DB_PASSWORD"),
        db=os.getenv("DB_NAME"),
    )
    db.connect()
    # Инициализируем бота и передаем токен
    bot = Bot(token=os.getenv("TOKEN"))
    # Инициализируем диспетчер
    dp = Dispatcher()
    # Подключаем к диспетчеру роутеры
    dp.include_routers(router, admin)
    await dp.start_polling(bot)


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("Exit")


ну и classes.py:
def upsert_user(
        self,
        user_id: int,
        is_bot: bool,
        first_name: str,
        last_name: str,
        username: str,
        language_code: str,
        is_premium: bool,
    ):
        # SQL-запрос для вставки или обновления пользователя
        sql = """
        INSERT INTO users (user_id, is_bot, first_name, last_name, username, language_code, is_premium) 
        VALUES (?, ?, ?, ?, ?, ?, ?)
        ON DUPLICATE KEY UPDATE 
            is_bot = ?, 
            first_name = ?, 
            last_name = ?, 
            username = ?, 
            language_code = ?, 
            is_premium = ?
        """
        # Выполняем запрос с передачей параметров
        self.execute_query(
            sql,
            user_id,
            is_bot,
            first_name,
            last_name,
            username,
            language_code,
            is_premium,
            is_bot,
            first_name,
            last_name,
            username,
            language_code,
            is_premium,
        )


выходит вот такая вот ошибка
TypeError: add_user_data() missing 1 required positional argument: 'db'


подскажите что не так, если как bot: Bot сообразил, то с db не понимаю
  • Вопрос задан
  • 43 просмотра
Решения вопроса 1
@VorobAlex Автор вопроса
Вроде как нужно смотреть в сторону BaseMiddleware
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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