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}")