Как исправить TypeError: missing 1 required positional argument при запросе в БД aiogram

Traceback:

TypeError: BotDB.get_schedule_for_duplicate() missing 1 required positional argument: 'end_of_week'

Также я использую пул соединений, для одновременной обработки нескольких асинхронных запросов к базе данных.

Это файл в котором находятся все обращения к базе данных:

import datetime
from sqlite3 import Connection
from sqlite3.dbapi2 import Cursor
import aiosqlite

class SQLitePool:
def __init__(self, max_connections=5):
    self._connection_pool = []
    self._max_connections = max_connections

async def create_pool(self):
    for _ in range(self._max_connections):
        conn = await aiosqlite.connect('Help_For_Tutors.db')
        self._connection_pool.append(conn)

async def get_connection(self) -> Connection:
    if len(self._connection_pool) < self._max_connections:
        return self._connection_pool.pop()
    else:
        raise Exception("Connection limit reached")

async def release_connection(self, conn: Connection):
    self._connection_pool.append(conn)


class BotDB:

    def __init__(self, db_file, pool: SQLitePool):
        self._db_file = db_file
        self._pool = pool

    async def _get_connection(self) -> Connection:
        return await self._pool.get_connection()

    async def _release_connection(self, conn: Connection):
        await self._pool.release_connection(conn)

    async def get_schedule_for_duplicate(self, start_of_week, end_of_week):
    """Витягуємо дані які потрібні для автоматичного створення уроку"""
    async with await self._get_connection() as conn:
        cursor: Cursor = await conn.cursor()
        cursor.execute("SELECT lesson_day, lesson_start, lesson_duration, lesson_end,"
                       " student_id, tutor_id, date, type_lesson "
                       "FROM Schedule "
                       f"WHERE date BETWEEN '{start_of_week}' AND '{end_of_week}'")
        return cursor.fetchall()

В этом файле я вызываю методы которые находятся в предыдущем файле:

import datetime
from db import BotDB, SQLitePool

async def main():
    pool = SQLitePool(max_connections=10)
    await pool.create_pool()

    BotDB("Help_For_Tutors.db", pool)

async def duplicate_lessons():
    counter = 4  # Ця змінна визначає кількість тижнів, які потрібно дублювати
    n = 0

    while counter > n:
        # Отримуємо поточну дату
        today = datetime.datetime.now().date()

        # Знаходимо день початку тижня (понеділок)
        start_of_week = today - datetime.timedelta(days=today.weekday()) + datetime.timedelta(weeks=n)

        # Знаходимо день кінця тижня (неділя)
        end_of_week = start_of_week + datetime.timedelta(days=6)

        lesson_data = await BotDB.get_schedule_for_duplicate(start_of_week, end_of_week)

        for lesson_ in lesson_data:
            if lesson_[7] == 'constant':
                lesson_day = lesson_[0]
                lesson_start = lesson_[1]
                lesson_duration = lesson_[2]
                lesson_end = lesson_[3]
                student_id = lesson_[4]
                tutor_id = lesson_[5]
                date = lesson_[6]
                type_lesson = lesson_[7]

                lesson_date = datetime.datetime.strptime(date, '%Y-%m-%d').date()

                new_date = lesson_date + datetime.timedelta(weeks=1)
                new_lesson_date = new_date.strftime('%Y-%m-%d')

                if BotDB.check_lesson_exist(student_id, tutor_id, new_lesson_date, lesson_start) == 0:
                    await BotDB.duplicate_lesson(lesson_day, lesson_start, lesson_duration, lesson_end, student_id,
                                                 tutor_id, new_lesson_date, type_lesson)

        n += 1

Ответы (1 шт):

Автор решения: CrazyElf

BotDB - это класс. Чтобы использовать поля экземпляра класса self вам нужно создать экземпляр класса, присвоить его в какую-то переменную и дальше пользоваться этим экземпляром, а не классом. Что-то типа:

bot = BotDB("Help_For_Tutors.db", pool)
...

bot.get_schedule_for_duplicate(start_of_week, end_of_week)
→ Ссылка