Spaces:
Runtime error
Runtime error
""" | |
This module handles database connection, session management, table creation, | |
and initial data seeding. | |
""" | |
import sqlalchemy | |
from sqlalchemy.orm import sessionmaker, Session as SQLAlchemySessionType | |
from datetime import datetime | |
# Import the centralized settings object | |
from src.config import settings | |
# Import Enums, Base, and specific ORM models needed for initialization | |
from src.models import ( | |
Base, | |
ClearanceDepartment, | |
ClearanceStatusEnum, | |
Student as StudentORM, | |
ClearanceStatus as ClearanceStatusORM | |
) | |
# --- Database Engine Setup --- | |
# Create the SQLAlchemy engine using the URI from our secure settings. | |
engine = sqlalchemy.create_engine( | |
settings.POSTGRES_URI, | |
pool_pre_ping=True # Helps prevent errors from stale connections | |
) | |
# --- Session Management --- | |
# Create a configured "Session" class. This is our session factory. | |
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) | |
def get_db(): | |
""" | |
FastAPI dependency that creates and yields a new database session | |
for each request, and ensures it's closed afterward. | |
""" | |
db = SessionLocal() | |
try: | |
yield db | |
finally: | |
db.close() | |
# --- Database Initialization Functions --- | |
def create_db_and_tables(): | |
""" | |
Creates all database tables defined in `src/models.py` if they do not exist. | |
This function should be called once on application startup. | |
""" | |
try: | |
print("Attempting to create database tables (if they don't exist)...") | |
Base.metadata.create_all(bind=engine) | |
print("Database tables are ready.") | |
except Exception as e: | |
print(f"FATAL: Error during database table creation: {e}") | |
print("Please ensure your database is accessible and the POSTGRES_URI is correct.") | |
# In a real production app, you might want to exit here if the DB is critical | |
raise | |
def initialize_student_clearance_statuses(db: SQLAlchemySessionType, student_id_str: str): | |
""" | |
Creates default 'NOT_COMPLETED' clearance status entries for all required | |
departments for a newly created student. This ensures every student's | |
clearance record is complete from the start. | |
""" | |
student = db.query(StudentORM).filter(StudentORM.student_id == student_id_str).first() | |
if not student: | |
print(f"Warning: Student '{student_id_str}' not found when trying to initialize clearance statuses.") | |
return | |
for dept in ClearanceDepartment: | |
# Check if a status for this department already exists | |
exists = db.query(ClearanceStatusORM).filter( | |
ClearanceStatusORM.student_id == student_id_str, | |
ClearanceStatusORM.department == dept | |
).first() | |
if not exists: | |
# If it doesn't exist, create the default record | |
new_status = ClearanceStatusORM( | |
student_id=student_id_str, | |
department=dept, | |
status=ClearanceStatusEnum.NOT_COMPLETED | |
) | |
db.add(new_status) | |
# Commit all the new statuses at once | |
try: | |
db.commit() | |
except Exception as e: | |
print(f"Error committing initial clearance statuses for student {student_id_str}: {e}") | |
db.rollback() | |
raise | |
# Alias for backward compatibility | |
initialize_student_clearance_statuses_orm = initialize_student_clearance_statuses |