Как исправить 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)