85 lines
2.9 KiB
Python
85 lines
2.9 KiB
Python
from sqlalchemy import create_engine, insert, select
|
|
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
|
|
|
|
def get_exercises_from_training(self, training_pk: int):
|
|
"""Method for getting rows of exercises, linked to training by its PK
|
|
|
|
Args:
|
|
training_pk: Training table primary key
|
|
"""
|
|
statement = select(exercise).where(exercise.c.Training == training_pk)
|
|
print(f"Exercises SQL statement: {statement}")
|
|
|
|
|
|
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
|