Consultas Avanzadas con SQL Model y Filtrado de Estados en FastAPI

Clase 16 de 23Curso 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 de str y de la clase Enum.
  • 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.