Spaces:
Sleeping
Sleeping
from pydantic import BaseModel | |
from fastapi import FastAPI, HTTPException, Depends | |
from fastapi.middleware.cors import CORSMiddleware | |
from sqlalchemy import create_engine, text | |
from sqlalchemy.orm import sessionmaker, declarative_base | |
import uvicorn | |
import os | |
from dotenv import load_dotenv | |
load_dotenv() # Carga las variables de entorno desde el archivo .env | |
DATABASE_URL = os.getenv("DB_URI") | |
# Configurar SQLAlchemy | |
engine = create_engine(DATABASE_URL) | |
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) | |
Base = declarative_base() | |
# CORS | |
app = FastAPI() | |
app.add_middleware( | |
CORSMiddleware, | |
allow_origins=["*"], | |
allow_credentials=True, | |
allow_methods=["*"], | |
allow_headers=["*"], | |
) | |
# Modelo para recibir consultas SQL | |
class SQLQuery(BaseModel): | |
query: str | |
# Dependencia para obtener la sesi贸n de la base de datos | |
def get_db(): | |
db = SessionLocal() | |
try: | |
yield db | |
finally: | |
db.close() | |
def execute_query(sql_query: SQLQuery, db=Depends(get_db)): | |
try: | |
result = db.execute(text(sql_query.query)) | |
if result.returns_rows: | |
rows = result.fetchall() | |
columns = result.keys() | |
results = [dict(zip(columns, row)) for row in rows] | |
return {"results": results} | |
db.commit() | |
return {"message": "Consulta ejecutada exitosamente"} | |
except Exception as e: | |
db.rollback() | |
raise HTTPException(status_code=400, detail=str(e)) | |
def list_tables(db=Depends(get_db)): | |
try: | |
result = db.execute(text("SHOW TABLES;")) | |
tables = [row[0] for row in result.fetchall()] | |
return {"tables": tables} | |
except Exception as e: | |
raise HTTPException(status_code=400, detail=str(e)) | |
if __name__ == "__main__": | |
uvicorn.run(app, host="0.0.0.0", port=7860) | |