Integración de SQLModel en FastAPI para Manejo de Bases de Datos

Clase 9 de 23Curso de FastAPI

Resumen

Implementar SQLModel en una aplicación requiere precisión, especialmente en la creación y manipulación de tablas y registros. Aquí te explicamos cómo gestionar correctamente las claves primarias y la creación de tablas, además de cómo integrar los endpoints de creación y consulta en FastAPI.

¿Por qué ocurre el error de primary key?

El error de “no se encuentra ninguna primary key” surge porque al implementar SQLModel, los campos como el ID aún no están configurados como clave primaria. Para resolver esto:

  • Define el campo ID como primary_key=True.
  • Configura un valor por defecto, por ejemplo None, para que SQLModel pueda gestionar el incremento automático de la clave primaria en la base de datos.

¿Cómo configurar los campos sin primary key para almacenarlos en la base de datos?

Para que cada campo sea almacenado en la base de datos, es necesario:

  • Agregar la clase Field en cada campo sin primary key.
  • Definir default=None en cada campo para que SQLModel los incluya en la estructura de la tabla.
  • Asegúrate de que cualquier campo sin Field o configuración adicional no se guardará en la base de datos.

¿Cómo crear las tablas en SQLite?

Si aún no ves el archivo .sqlite3 en tu directorio, es porque las tablas no se han creado. Para resolverlo:

  1. Crea una función create_all_tables que reciba la instancia de FastAPI como parámetro.
  2. Utiliza SQLModel.metadata.create_all junto con el motor de base de datos configurado para generar las tablas.
  3. Ejecuta esta función al iniciar la aplicación en el archivo main.py.

Este proceso generará automáticamente el archivo de base de datos SQLite y las tablas definidas en el modelo.

¿Cómo integrar el endpoint de creación de customers?

Para gestionar el endpoint de creación de customers y almacenar registros en la base de datos:

  • Usa session.add(customer) para agregar el nuevo customer en la sesión de base de datos.
  • Ejecuta session.commit() para guardar los cambios de manera definitiva.
  • Llama a session.refresh(customer) para actualizar el objeto en memoria con el ID generado por la base de datos.

Esto garantiza que cada registro creado tenga su ID único asignado directamente desde la base de datos.

¿Cómo consultar los customers desde la base de datos?

Para listar todos los customers desde la base de datos y retornar los resultados en JSON:

  • Importa select de SQLModel.
  • Usa session.execute(select(Customer)).all() para obtener todos los registros de tipo customer.
  • Devuelve esta lista de customers directamente en la respuesta del endpoint.

¿Cómo crear un endpoint para obtener un customer por ID?

Como reto, implementa un endpoint que permita obtener un customer específico según su ID. Recuerda:

  • Usa la sesión para ejecutar la consulta SQL.
  • Considera los casos donde el customer solicitado no exista, devolviendo un mensaje adecuado o un código de error si es necesario.