Spaces:
Running
Running
chore: major reliability overhaul - added result_data storage, auto-migrations, and fixed JSON parsing
Browse files- app/db/models/analysis_run.py +2 -1
- app/main.py +8 -0
- app/services/analysis_service.py +1 -1
app/db/models/analysis_run.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
"""
|
| 2 |
Database Models for Analysis Runs
|
| 3 |
"""
|
| 4 |
-
from sqlalchemy import Column, DateTime, Text, ForeignKey, UUID
|
| 5 |
from sqlalchemy.orm import relationship
|
| 6 |
from datetime import datetime
|
| 7 |
import uuid
|
|
@@ -18,6 +18,7 @@ class AnalysisRun(Base):
|
|
| 18 |
status = Column(Text)
|
| 19 |
started_at = Column(DateTime)
|
| 20 |
completed_at = Column(DateTime)
|
|
|
|
| 21 |
|
| 22 |
# Relationships
|
| 23 |
project = relationship("Project", back_populates="analysis_runs")
|
|
|
|
| 1 |
"""
|
| 2 |
Database Models for Analysis Runs
|
| 3 |
"""
|
| 4 |
+
from sqlalchemy import Column, DateTime, Text, ForeignKey, UUID, JSON
|
| 5 |
from sqlalchemy.orm import relationship
|
| 6 |
from datetime import datetime
|
| 7 |
import uuid
|
|
|
|
| 18 |
status = Column(Text)
|
| 19 |
started_at = Column(DateTime)
|
| 20 |
completed_at = Column(DateTime)
|
| 21 |
+
result_data = Column(JSON) # JSON blob for frontend consumption
|
| 22 |
|
| 23 |
# Relationships
|
| 24 |
project = relationship("Project", back_populates="analysis_runs")
|
app/main.py
CHANGED
|
@@ -79,6 +79,14 @@ async def lifespan(app: FastAPI):
|
|
| 79 |
with engine.connect().execution_options(isolation_level="AUTOCOMMIT") as ddl_conn:
|
| 80 |
ddl_conn.execute(text("ALTER TABLE research_papers ADD COLUMN summary TEXT"))
|
| 81 |
logger.info("Added 'summary' column to research_papers table.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 82 |
except Exception as e:
|
| 83 |
logger.warning(f"Auto-migration warning (non-fatal): {str(e)}")
|
| 84 |
|
|
|
|
| 79 |
with engine.connect().execution_options(isolation_level="AUTOCOMMIT") as ddl_conn:
|
| 80 |
ddl_conn.execute(text("ALTER TABLE research_papers ADD COLUMN summary TEXT"))
|
| 81 |
logger.info("Added 'summary' column to research_papers table.")
|
| 82 |
+
|
| 83 |
+
# Check if 'result_data' column exists in analysis_runs
|
| 84 |
+
res_res = conn.execute(text("SELECT column_name FROM information_schema.columns WHERE table_name='analysis_runs' AND column_name='result_data'")).fetchone()
|
| 85 |
+
if not res_res:
|
| 86 |
+
with engine.connect().execution_options(isolation_level="AUTOCOMMIT") as ddl_conn:
|
| 87 |
+
# On utilise JSON pour Postgres, ou TEXT comme fallback si besoin
|
| 88 |
+
ddl_conn.execute(text("ALTER TABLE analysis_runs ADD COLUMN result_data JSON"))
|
| 89 |
+
logger.info("Added 'result_data' column to analysis_runs table.")
|
| 90 |
except Exception as e:
|
| 91 |
logger.warning(f"Auto-migration warning (non-fatal): {str(e)}")
|
| 92 |
|
app/services/analysis_service.py
CHANGED
|
@@ -43,7 +43,7 @@ class AnalysisService:
|
|
| 43 |
analysis.status = status
|
| 44 |
analysis.completed_at = datetime.utcnow()
|
| 45 |
if result:
|
| 46 |
-
analysis.result_data =
|
| 47 |
self.analysis_repo.db.add(analysis)
|
| 48 |
self.analysis_repo.db.commit()
|
| 49 |
self.analysis_repo.db.refresh(analysis)
|
|
|
|
| 43 |
analysis.status = status
|
| 44 |
analysis.completed_at = datetime.utcnow()
|
| 45 |
if result:
|
| 46 |
+
analysis.result_data = result # SQLAlchemy handles JSON serialization
|
| 47 |
self.analysis_repo.db.add(analysis)
|
| 48 |
self.analysis_repo.db.commit()
|
| 49 |
self.analysis_repo.db.refresh(analysis)
|