PIbd-42_SSPR/db/repositories/experiment_parameters_repos.py

58 lines
2.4 KiB
Python

import hashlib
from typing import Sequence
import pandas as pd
from fastapi import HTTPException
from sqlalchemy.future import select
from db.crud import create
from db.models.experiment_parameters_model import ExperimentParameters
from db.postgres_db_connection import async_session_postgres
async def get_exp_parameters_by_category(category_id: int) -> Sequence[ExperimentParameters]:
async with async_session_postgres() as session:
result = await session.execute(
select(ExperimentParameters).where(ExperimentParameters.experiment_category_id == category_id)
)
return result.scalars().all()
async def get_exp_parameters_by_exp_hash(exp_hash: str) -> Sequence[ExperimentParameters]:
async with async_session_postgres() as session:
result = await session.execute(
select(ExperimentParameters).where(ExperimentParameters.experiment_hash == exp_hash)
)
return result.scalars().all()
def generate_experiment_hash(data: dict) -> str:
"""Генерация уникального хеша на основе данных эксперимента"""
hash_input = f"{data['outer_blades_count']}_{data['outer_blades_length']}_{data['outer_blades_angle']}_{data['middle_blades_count']}_{data['load']}_{data['recycling_level']}"
return hashlib.sha256(hash_input.encode()).hexdigest()
async def save_experiment_to_db(df: pd.DataFrame):
for _, row in df.iterrows():
try:
# Преобразуем load и recycling_level в соответствующие id
load_id = int(row['load'])
recycling_id = int(row['recycling_level'])
# Генерация хеша для experiment_hash
experiment_hash = generate_experiment_hash(row)
await create(
ExperimentParameters,
outer_blades_count=int(row['outer_blades_count']),
outer_blades_length=float(row['outer_blades_length']),
outer_blades_angle=float(row['outer_blades_angle']),
middle_blades_count=int(row['middle_blades_count']),
load_id= None,
recycling_id=None,
experiment_hash=experiment_hash
)
except Exception as e:
print(f"Ошибка при сохранении данных: {e}")
raise HTTPException(status_code=500, detail=f"Ошибка при сохранении данных: {e}")