Backend con base de datos relacional MySQL

This commit is contained in:
Mireya Cueto Garrido
2026-03-27 09:02:28 +01:00
parent e9a3bf6c21
commit 57b64b4f1e
15 changed files with 106 additions and 19 deletions
+6 -2
View File
@@ -2,6 +2,10 @@ FROM python:3.10-slim
WORKDIR /app WORKDIR /app
RUN pip install fastapi uvicorn COPY requirements.txt .
CMD ["uvicorn", "api.routes:app", "--host", "0.0.0.0", "--port", "8000", "--reload"] RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "api.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
View File
+18
View File
@@ -0,0 +1,18 @@
import os
from sqlalchemy import create_engine
DB_USER = "root"
DB_PASSWORD = "root"
DB_HOST = "db"
DB_PORT = "3306"
DB_NAME = "deckofcards"
DATABASE_URL = (
f"mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}"
)
engine = create_engine(
DATABASE_URL,
pool_pre_ping=True,
echo=False
)
+5
View File
@@ -0,0 +1,5 @@
from .connection import engine
from .models import Base
def init_db():
Base.metadata.create_all(bind=engine)
+14
View File
@@ -0,0 +1,14 @@
from sqlalchemy.orm import declarative_base
from sqlalchemy import Column, Integer, String, Float
Base = declarative_base()
class DoCMFLevel(Base):
__tablename__ = "docmf_levels"
id = Column(Integer, primary_key=True, index=True)
term = Column(String(50), nullable=False)
core_a = Column(Float, nullable=False)
core_b = Column(Float, nullable=False)
support_c = Column(Float, nullable=False)
support_d = Column(Float, nullable=False)
+15
View File
@@ -0,0 +1,15 @@
from sqlalchemy.orm import sessionmaker
from .connection import engine
SessionLocal = sessionmaker(
autocommit=False,
autoflush=False,
bind=engine
)
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
+18 -6
View File
@@ -1,14 +1,25 @@
from fastapi import FastAPI from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
from routers.value_function import router as value_router from api.database.init_db import init_db
from routers.docmf_build import router as docmf_build_router
from routers.docmf_evaluate import router as docmf_eval_router # Routers
from routers.docmf_simple_validation import router as simple_validation_router from api.routers.test_db import router as test_db_router
from routers.docmf_validation import router as validation_router from api.routers.value_function import router as value_router
from api.routers.docmf_build import router as docmf_build_router
from api.routers.docmf_evaluate import router as docmf_eval_router
from api.routers.docmf_simple_validation import router as simple_validation_router
from api.routers.docmf_validation import router as validation_router
app = FastAPI() @asynccontextmanager
async def lifespan(app: FastAPI):
init_db()
yield
app = FastAPI(lifespan=lifespan)
app.add_middleware( app.add_middleware(
CORSMiddleware, CORSMiddleware,
@@ -18,6 +29,7 @@ app.add_middleware(
allow_headers=["*"], allow_headers=["*"],
) )
app.include_router(test_db_router, prefix="/api")
app.include_router(value_router, prefix="/api/criteria/doc") app.include_router(value_router, prefix="/api/criteria/doc")
app.include_router(docmf_build_router, prefix="/api/criteria/doc-mf") app.include_router(docmf_build_router, prefix="/api/criteria/doc-mf")
app.include_router(docmf_eval_router, prefix="/api/criteria/doc-mf") app.include_router(docmf_eval_router, prefix="/api/criteria/doc-mf")
+2 -2
View File
@@ -1,6 +1,6 @@
from fastapi import APIRouter, HTTPException from fastapi import APIRouter, HTTPException
from models.docmf_models import DoCMFMultiRequest from api.models.docmf_models import DoCMFMultiRequest
from services.docmf_build_service import build_docmf_multi from api.services.docmf_build_service import build_docmf_multi
router = APIRouter() router = APIRouter()
+2 -2
View File
@@ -1,6 +1,6 @@
from fastapi import APIRouter, HTTPException from fastapi import APIRouter, HTTPException
from models.evaluation_models import EvaluationRequest from api.models.evaluation_models import EvaluationRequest
from services.docmf_evaluate_service import evaluate_docmf from api.services.docmf_evaluate_service import evaluate_docmf
router = APIRouter() router = APIRouter()
@@ -1,6 +1,6 @@
from fastapi import APIRouter, HTTPException from fastapi import APIRouter, HTTPException
from models.docmf_simple_validation_models import SimpleValidationRequest from api.models.docmf_simple_validation_models import SimpleValidationRequest
from services.docmf_simple_validation_service import validate_simple_levels from api.services.docmf_simple_validation_service import validate_simple_levels
router = APIRouter() router = APIRouter()
+2 -2
View File
@@ -1,6 +1,6 @@
from fastapi import APIRouter, HTTPException from fastapi import APIRouter, HTTPException
from models.docmf_validation_models import ValidationRequest from api.models.docmf_validation_models import ValidationRequest
from services.docmf_validation_service import validate_levels from api.services.docmf_validation_service import validate_levels
router = APIRouter() router = APIRouter()
+13
View File
@@ -0,0 +1,13 @@
from fastapi import APIRouter, Depends
from sqlalchemy import text
from api.database.session import get_db
router = APIRouter()
@router.get("/test-db")
def test_db_connection(db=Depends(get_db)):
try:
db.execute(text("SELECT 1"))
return {"status": "ok", "message": "Conexión a MySQL correcta"}
except Exception as e:
return {"status": "error", "message": str(e)}
+2 -2
View File
@@ -1,6 +1,6 @@
from fastapi import APIRouter, HTTPException from fastapi import APIRouter, HTTPException
from models.value_function_models import ValueFunctionRequest from api.models.value_function_models import ValueFunctionRequest
from services.value_function_service import compute_value_function, compute_points from api.services.value_function_service import compute_value_function, compute_points
router = APIRouter() router = APIRouter()
@@ -1,4 +1,4 @@
from utils.interpolation import linear_interpolation from api.utils.interpolation import linear_interpolation
def evaluate_docmf(request): def evaluate_docmf(request):
x = request.x x = request.x
+6
View File
@@ -0,0 +1,6 @@
fastapi
uvicorn
sqlalchemy
pymysql
pydantic
cryptography