DÍA 10Endpoints de lectura para Sakila · Python Backend y APIs para Datos

Crea una respuesta agregada con cantidad e importe por identificador de staff.

Día 10 20 minIntermedio

Base oficial Sakila de MySQL

Agregación de payment por staff_id; no representa tiendas ni actividad empresarial real.

Resumir pagos por staff

Objetivos

Vas a convertir los registros de pago en un resumen por staff_id y devolver solo las medidas declaradas.

Concepto

Una agregación combina varias filas en una fila por grupo. Aquí payment tiene una fila por pago y staff_id forma el grupo; COUNT cuenta pagos y SUM suma sus importes. La respuesta ya no tiene una fila por payment_id, sino una por staff.

SQLAlchemy crea expresiones SQL a partir de columnas del modelo. group_by(Payment.staff_id) define el grupo y order_by da un orden estable. Una suma es una medida descriptiva del extracto Sakila; por sí sola no explica desempeño, tienda, causas ni una empresa real.

Ejemplo

Define el contrato de respuesta:

from decimal import Decimal
 
from pydantic import BaseModel
 
 
class PaymentSummary(BaseModel):
    staff_id: int
    payment_count: int
    total_amount: Decimal

Construye la consulta de lectura:

from sqlalchemy import func, select
 
@app.get("/payments/summary", response_model=list[PaymentSummary])
def payment_summary(db: Session = Depends(get_db)) -> list[PaymentSummary]:
    statement = (
        select(
            Payment.staff_id,
            func.count(Payment.payment_id).label("payment_count"),
            func.round(func.sum(Payment.amount), 2).label("total_amount"),
        )
        .group_by(Payment.staff_id)
        .order_by(Payment.staff_id)
    )
    rows = db.execute(statement).mappings().all()
    return [PaymentSummary.model_validate(row) for row in rows]

Cada elemento JSON tiene staff_id, payment_count y total_amount. El total se redondea a dos posiciones para mostrar moneda con la precisión de amount; el redondeo de presentación no debe confundirse con un cálculo financiero más complejo.

Práctica guiada

  1. Predice cuántos grupos aparecen si el extracto contiene dos staff_id distintos.
  2. Identifica qué cambia el grano de pago a grupo.
  3. Compara la suma de grupos con una suma directa sobre el mismo filtro.

Reto

Agrega a la consulta un filtro opcional por staff_id antes del group_by; conserva el orden y el contrato de salida.

Intenta el reto antes de consultar las pistas.

Quiz

1. Después de group_by(Payment.staff_id), ¿qué representa una fila del resultado?
2. ¿Qué cuenta func.count(Payment.payment_id)?
3. ¿Qué no demuestra por sí sola una suma por staff_id?

Comprobación

Ya tienes endpoints de lectura para filas y resúmenes. Las siguientes lecciones prueban sus contratos sin necesitar un servidor Sakila activo.

TU PROGRESO

Cargando estado…