Relaciones Muchos a Muchos en Bases de Datos con SQLModel
Clase 14 de 23 • Curso de FastAPI
Resumen
Las relaciones de muchos a muchos en bases de datos nos permiten asociar múltiples elementos de una tabla con muchos elementos de otra, utilizando una tabla intermedia. Esta tabla de enlace facilita las conexiones entre ambos elementos, permitiendo una mayor flexibilidad en la organización y gestión de los datos.
¿Qué son exactamente las relaciones de muchos a muchos?
Este tipo de relaciones ocurren cuando varios elementos de una tabla pueden vincularse simultáneamente con varios elementos de otra tabla. Para manejar de forma efectiva esta situación, se utiliza una tercera tabla, conocida como tabla intermedia o de asociación.
Imagina que tienes una tabla de usuarios (customer
) y otra tabla de planes (plan
). Un usuario podría suscribirse a múltiples planes, y al mismo tiempo, un solo plan también podría ser adquirido por varios usuarios. La tabla intermedia sería customer_plan
.
¿Cómo crear estas relaciones en código utilizando SQLModel?
Desde el archivo models.py
, se crea primero una clase llamada plan
que hereda de SQLModel
, indicando que es una tabla con el parámetro table=True
. Esta tabla tiene los siguientes campos:
id
: Identificador entero, que actúa como clave primaria.nombre
: Texto obligatorio.precio
: Número entero.descripción
: Texto explicativo.
A continuación, se crea la tabla intermedia customer_plan
, también heredando de SQLModel
y siendo tabla activa (table=True
). Esta tabla incluye:
id
: Clave primaria tipo entero.plan_id
: Entero con una llave foránea referida aplan.id
.customer_id
: Entero con una llave foránea hacia la tablacustomer
.
Finalmente, se establecen relaciones bidireccionales mediante la funcionalidad relationship
. En la clase plan
, se crea una relación llamada customers
, que conecta los planes con los usuarios. Esta relación usa la variable plans
de la tabla asociada (back_populates
) y define claramente que customer_plan
es la tabla de enlace (link_model
).
De manera equivalente, en la clase customer
, se crea una nueva relación llamada plans
, referenciada igualmente vía back_populates
y mediante la tabla intermedia customer_plan
.
¿Cuáles son los errores frecuentes al crear relaciones con SQLModel?
Un error típico ocurre cuando la tabla intermedia no tiene definida claramente una clave primaria (primary key
). SQLModel necesita explícitamente un identificador propio en cada tabla para gestionar efectivamente los datos.
Si aparece un error indicando que no se encuentra una clave primaria:
- Revisa tu tabla intermedia (
customer_plan
) - Asegúrate de haber agregado un campo con:
id: int = Field(primary_key=True)
Esto resolverá el error y permitirá a SQLModel gestionar adecuadamente todas las relaciones.
¿Cómo validar nuestras tablas creadas en la base de datos?
Para verificar las tablas que SQLModel generó, se utiliza una consulta desde terminal con SQLite:
- Ejecuta el comando
.tables
para listar todas las tablas. - Revisa el esquema específico ejecutando el comando
.schema nombre_tabla
(por ejemplo,.schema customer_plan
).
Verificar en consola los campos y llaves foráneas te da certeza de que las relaciones se han configurado correctamente.