Consultas Avanzadas con SQL Model y Filtrado de Estados en FastAPI
Clase 16 de 23 • Curso de FastAPI
Resumen
Aprender cómo realizar consultas avanzadas con SQL Model usando FastAPI te permitirá aprovechar al máximo las bases de datos en tus aplicaciones. En esta guía, te mostraré cómo ampliar el modelo actual, crear un campo que indique el estado de cada plan del cliente (activo o inactivo) e implementar filtros efectivos desde la URL para mejorar el control sobre los datos.
¿Cómo agregar un nuevo campo usando enums?
Para determinar fácilmente qué planes están activos o inactivos, agregarás el campo Status
al modelo CustomerPlan
. Utilizarás un enum, una estructura en Python ideal para esto, definida con ayuda del módulo enum
.
Para empezar:
- Creas una clase llamada
StatusEnum
, que hereda destr
y de la claseEnum
. - Dentro especificas los dos estados posibles:
from enum import Enum
class StatusEnum(str, Enum):
active = "active"
inactive = "inactive"
Este nuevo campo lo agregas a tu base de datos definiendo su valor por defecto como active
. Luego, recreas la base de datos para incluir esta actualización correctamente.
¿Cómo usar Query Params en FastAPI?
FastAPI ofrece la clase Query
que permite enviar parámetros vía URL fácilmente. Estos se conocen como Query Params: pares llave-valor que acompañan la URL.
- Defines una nueva variable en tu endpoint,
plan_status
. - Evita conflictos con nombres existentes utilizando nombres alternativos claramente diferenciados, como
plan_status
.
La definición de esta nueva variable queda así:
from fastapi import Query
plan_status: StatusEnum = Query(default=StatusEnum.active)
Esta variable te permitirá manejar desde la URL cuál es el estado del plan que deseas crear o filtrar.
¿Cómo aplicar filtros avanzados en consultas con SQLModel?
El siguiente paso consiste en integrar estos filtros en tu endpoint de FastAPI. Para obtener solo los planes cuyo estado haya sido especificado por la URL, realizas lo siguiente:
- Creas una consulta usando
Select
. - Utilizas dos condiciones bajo cláusulas
Where
para filtrar por estado y por cliente.
Ejemplo práctico:
from sqlmodel import Session, select
query = select(CustomerPlan).where(
CustomerPlan.customer_id == customer_id
).where(
CustomerPlan.status == plan_status
)
plans = session.exec(query).all()
return plans
¡Y listo! Ya tienes una consulta filtrada perfectamente adaptada a tus necesidades específicas.
¿Has probado ya implementar múltiples filtros o estados adicionales en tu aplicación? Comparte tu experiencia en los comentarios.