from sqlalchemy import create_engine, insert from sqlalchemy.engine.base import Engine from datetime import date from dbapi.tables import training, exercise, approach class DatabaseInterfasesMixin: """Mixin for interfaces, that works with database""" def __init__(self, engine: Engine) -> None: self.engine: Engine = engine class TrainingRepository(DatabaseInterfasesMixin): """Training table repository""" def create_training(self, date: date) -> int: """Method for creating new instance of training Args: date: date of a training Returns: Primary key of created training entry """ new_instance_statement = insert(training).values(Date=date) with self.engine.connect() as conn: result = conn.execute(new_instance_statement) inerted_entry_pk: int = result.inserted_primary_key[0] conn.commit() return inerted_entry_pk class ExerciseRepository(DatabaseInterfasesMixin): """Exercise table repository""" def create_exercise(self, training_pk: int, exercise_name: str) -> int: """Method for creating new instance of exercise table Args: training_pk: Primary key of associated training instance exercise_name: Name of an exercise Returns: Primary key of created exercise entry """ new_instance_statement = insert(exercise).values( Training=training_pk, Name=exercise_name ) with self.engine.connect() as conn: result = conn.execute(new_instance_statement) inserted_entry_pk: int = result.inserted_primary_key[0] conn.commit() return inserted_entry_pk class ApproachRepository(DatabaseInterfasesMixin): """Approach table repository""" def create_approach(self, exercise_pk: int, weight: float, reps: int) -> int: """Method for creating new instance of approach table Args: exercise_pk: Primary key of an associated exercise weight: Approach weight reps: Amount of reps in approach Returns: Primary key of created exercise entry """ new_instance_statement = insert(approach).values( Exercise=exercise_pk, Weight=weight, Reps=reps ) with self.engine.connect() as conn: result = conn.execute(new_instance_statement) inserted_entry_pk: int = result.inserted_primary_key[0] conn.commit() return inserted_entry_pk