Create repositories for tables

This commit is contained in:
pro100ton 2025-01-15 23:13:29 +03:00
parent d18b045529
commit e648edb262
4 changed files with 116 additions and 49 deletions

View file

@ -1,4 +0,0 @@
from sqlalchemy import create_engine
engine = create_engine("postgres+psycopg2:///:localhost:5433", echo=True)

76
dbapi/repositories.py Normal file
View file

@ -0,0 +1,76 @@
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

View file

@ -34,3 +34,4 @@ approach = Table(
# NOTE: We can access table metadata with associative array `c`
# print(training.c.keys())
# print(training.primary_key)
print(training.name)

84
main.py
View file

@ -4,6 +4,7 @@ import os
from typing import Dict, List
from sqlalchemy import Table, create_engine, text, insert
from dotenv import load_dotenv
from dbapi.connector import ApproachRepository, ExerciseRepository, TrainingRepository
from dbapi.tables import metadata_obj, training, exercise, approach
from obsidian.notes_parser import parse_training_data, remap_unique_exercises
from apple.notes_parser import parse_training_data as apple_parse_training_data
@ -43,8 +44,8 @@ engine = create_engine(
# TODO: Check how migrations are done
# NOTE: Drop all Tables from database
# metadata_obj.drop_all(engine)
# metadata_obj.create_all(engine)
metadata_obj.drop_all(engine)
metadata_obj.create_all(engine)
# NOTE: Table reflection - generating table object from existing tables (only tables, that are stored in metadata)
# some_table = Table("some_table", metadata_obj, autoload_with=engine)
@ -53,31 +54,24 @@ engine = create_engine(
# -----
# Inserting training values into database
# trainings: List[Training] = parse_training_data()
# for train in trainings:
# if not train:
# continue
# else:
# print("-------------------------\n" * 2)
# print(train)
# training_statement = insert(training).values(Date=train.date)
# # Create training
# with engine.connect() as conn:
# result = conn.execute(training_statement)
# train_pk = result.inserted_primary_key[0]
# for exr in train.exercises:
# approach_statements = []
# exercise_statement = insert(exercise).values(
# Training=train_pk, Name=exr.name
# )
# exr_insert = conn.execute(exercise_statement)
# exr_pk = exr_insert.inserted_primary_key[0]
# for appr in exr.approaches:
# appr_statement = insert(approach).values(
# Exercise=exr_pk, Weight=appr.weight, Reps=appr.reps
# )
# appr_insert = conn.execute(appr_statement)
# conn.commit()
trainings: List[Training] = parse_training_data()
for train in trainings:
if not train:
continue
else:
print("-------------------------\n" * 2)
print(train)
new_training_pk: int = TrainingRepository(engine).create_training(train.date)
for exr in train.exercises:
approach_statements = []
new_exercise_pk: int = ExerciseRepository(engine).create_exercise(
training_pk=new_training_pk, exercise_name=exr.name
)
for appr in exr.approaches:
new_approach_pk: int = ApproachRepository(engine).create_approach(
exercise_pk=new_exercise_pk, weight=appr.weight, reps=appr.reps
)
# -----
@ -155,21 +149,21 @@ engine = create_engine(
# Combined trainings
obsidian_trainings: List[Training] = parse_training_data()
obsidian_parsed_trainings = remap_unique_exercises(obsidian_trainings)
apple_trainings: List[Training] = apple_parse_training_data()
apple_parsed_trainings = apple_remaper(apple_trainings)
combined_trainings = obsidian_trainings + apple_trainings
unique_exercise_parsed_names = defaultdict(int)
for train in combined_trainings:
if not train:
continue
if train.exercises:
for exr in train.exercises:
if exr:
unique_exercise_parsed_names[exr.name] += 1
pprint(unique_exercise_parsed_names)
print(len(combined_trainings))
# obsidian_trainings: List[Training] = parse_training_data()
# obsidian_parsed_trainings = remap_unique_exercises(obsidian_trainings)
#
# apple_trainings: List[Training] = apple_parse_training_data()
# apple_parsed_trainings = apple_remaper(apple_trainings)
#
#
# combined_trainings = obsidian_trainings + apple_trainings
# unique_exercise_parsed_names = defaultdict(int)
# for train in combined_trainings:
# if not train:
# continue
# if train.exercises:
# for exr in train.exercises:
# if exr:
# unique_exercise_parsed_names[exr.name] += 1
# pprint(unique_exercise_parsed_names)
# print(len(combined_trainings))