Desarrollo

Primero vamos a comenzar por el desarrollo de una api rest en python que es el tema central del ejercicio para ver el coste de esfuerzo que cuesta en desarrllar con fast api ya que a la hora de diseñar un software hay en ocasiones que a uno como consultor el cliente te llega pedir una solución, la clásica sería con springboot pero en este ejercicio queremos ver que tanto implica desarrollar en python.
Abrimos Pycharm y creamos un proyecto le vamos a nombrar Micoven(Mi control de ventas)
phyton project

Dependencias

Vamos a instalar las siguientes dependencias que vamos a utilizar para crear nuestro proyecto son las siguientes:
  1. sqlalchemy
  2. fastapi
  3. uvicorn
  4. pymysql
phyton project
Una vez ya instaladas nuestras dependecias creamos el archivo models.py
 
        
from sqlalchemy  import Boolean,Column,Integer,String
from database import Base


class Usuario(Base):
    __tablename__ = 'usuario'
    email= Column(String(200),primary_key=True,index=True)
    nombre= Column(String(150))
    apellidopaterno= Column(String(150))
    apellidomaterno= Column(String(150))
    password= Column(String(150))
    
    
       
   

Creamos el archivo database.py
 
  
	  
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import declarative_base

URL_DATABASE = 'mysql+pymysql://admin:adminlara@127.0.0.1:3306/micovendb'

engine = create_engine(URL_DATABASE)

SessionLocal = sessionmaker(autocommit=False,autoflush=False,bind=engine)

Base=declarative_base()  
	  
	  
	  
    
   

Creamos un archivo llamado main.py
 
  
  from fastapi import  FastAPI,HTTPException,Depends,status
from pydantic import BaseModel
from typing import  Annotated
import models
from database import engine,SessionLocal
from sqlalchemy.orm import Session
import uvicorn
app = FastAPI()
models.Base.metadata.create_all(bind=engine)

class UsuarioBase(BaseModel):
    email:str
    nombre:str
    apellidopaterno:str
    apellidomaterno:str
    password:str

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

db_dependency = Annotated[Session,Depends(get_db)]

@app.get("/usuario/{email}",status_code=status.HTTP_200_OK)
async def  get_usuario(email:str,db:db_dependency):
    usuario=db.query(models.Usuario).filter(models.Usuario.email==email).first()
    if usuario is None:
        raise HTTPException(status_code=404,detail='El usario no funciona')
    return usuario


if __name__ == "__main__":
    uvicorn.run(app, host="127.0.0.1", port=8000)