loapi/app/database.py
2025-12-31 12:13:43 -06:00

66 lines
1.9 KiB
Python

"""Database configuration and connection management."""
from typing import Generator
from datetime import datetime
from sqlalchemy import MetaData, create_engine, Column, String, Numeric, Date, DateTime
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
from sqlalchemy.orm import DeclarativeBase, Session, sessionmaker
from app.config import settings
class Base(DeclarativeBase):
"""Base class for SQLAlchemy models."""
metadata = MetaData()
class PO10DAY(Base):
"""PO10DAY Oracle table model."""
__tablename__ = 'PO10DAY'
loan_id = Column(String(50), primary_key=True)
payoff_amount = Column(Numeric(15, 2), nullable=False)
payoff_date = Column(Date, nullable=False)
borrower_name = Column(String(100), nullable=True)
payment_method = Column(String(20), nullable=False)
notes = Column(String(500), nullable=True)
transaction_id = Column(String(36), nullable=False)
created_at = Column(DateTime, default=datetime.utcnow)
# Database URL construction
DATABASE_URL = f"oracle+oracledb://{settings.oracle_user}:{settings.oracle_password}@{settings.oracle_dsn}"
# Synchronous engine for Oracle
engine = create_engine(
DATABASE_URL,
echo=settings.debug,
pool_pre_ping=True,
pool_recycle=3600,
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
def get_db() -> Generator[Session, None]:
"""Dependency to get database session."""
db = SessionLocal()
try:
yield db
finally:
db.close()
class DatabaseService:
"""Database service for health checks and utilities."""
@staticmethod
def health_check() -> bool:
"""Check database connectivity."""
try:
with SessionLocal() as db:
db.execute("SELECT 1 FROM DUAL") # type:ignore[call-overload]
return True
except Exception:
return False