Las migrations en Django son una herramienta que permite gestionar cambios en el esquema de la base de datos de forma automática. Cada vez que se realiza un cambio en los modelos, las migraciones crean un archivo que refleja esos cambios y permite aplicarlos a la base de datos sin necesidad de escribir consultas SQL manualmente.
Una migration es un archivo que describe los cambios que se han hecho en los modelos de la aplicación (como crear, modificar o eliminar campos o tablas) y que Django puede ejecutar para sincronizar la base de datos con esos cambios. El sistema de migraciones es fundamental para mantener el esquema de la base de datos en línea con los modelos del proyecto a lo largo del desarrollo.
Cada vez que realizas cambios en los modelos de tu aplicación, debes generar las migraciones correspondientes para aplicar esos cambios en la base de datos.
Para crear migraciones, utiliza el comando:
python manage.py makemigrations
Este comando inspecciona los cambios en los modelos y genera un archivo de migración en la carpeta migrations
dentro de cada aplicación.
Una vez que las migraciones han sido generadas, debes aplicarlas a la base de datos usando:
python manage.py migrate
Esto ejecuta todas las migraciones pendientes y actualiza la base de datos con los cambios definidos.
Para ver qué migraciones han sido aplicadas o están pendientes, puedes usar:
python manage.py showmigrations
Este comando te muestra una lista de todas las migraciones y su estado (si ya han sido aplicadas o no).
Supongamos que tienes el siguiente modelo en models.py
:
from django.db import models
class Persona(models.Model):
nombre = models.CharField(max_length=100)
edad = models.IntegerField()
Al ejecutar makemigrations
, Django generará una migración que creará la tabla Persona
en la base de datos.
python manage.py makemigrations
Luego, aplicas la migración con:
python manage.py migrate
Si decides agregar un nuevo campo al modelo Persona
:
class Persona(models.Model):
nombre = models.CharField(max_length=100)
edad = models.IntegerField()
email = models.EmailField(default='')
Después de realizar el cambio en el modelo, genera la migración:
python manage.py makemigrations
Y aplica la migración a la base de datos:
python manage.py migrate
Si necesitas deshacer una migración, puedes revertirla con el comando migrate
y especificar la migración a la que deseas regresar.
Por ejemplo, para revertir la última migración:
python manage.py migrate mi_app nombre_de_migracion_previa
Django intenta generar las migraciones automáticamente, pero en algunos casos complejos, puede que necesites personalizar las migraciones.
Puedes editar manualmente un archivo de migración generado o crear uno personalizado. Un ejemplo común es cuando deseas realizar cambios en los datos de la base de datos (como un ajuste de valores predeterminados o una migración de datos).
Ejemplo de una migración personalizada que actualiza valores existentes:
from django.db import migrations
def actualizar_edades(apps, schema_editor):
Persona = apps.get_model('mi_app', 'Persona')
for persona in Persona.objects.all():
if persona.edad < 18:
persona.edad = 18
persona.save()
class Migration(migrations.Migration):
dependencies = [
('mi_app', '0001_initial'),
]
operations = [
migrations.RunPython(actualizar_edades),
]
Este archivo ejecutará la función actualizar_edades
cuando se aplique la migración, ajustando los valores del campo edad
en todos los objetos de la tabla Persona
.
1. Crear migración inicial para un modelo:
Si defines un modelo nuevo, como:
class Libro(models.Model):
titulo = models.CharField(max_length=200)
autor = models.CharField(max_length=100)
fecha_publicacion = models.DateField()
Ejecuta:
python manage.py makemigrations
python manage.py migrate
2. Agregar un campo a un modelo existente:
Si decides agregar un campo isbn
al modelo Libro
:
class Libro(models.Model):
titulo = models.CharField(max_length=200)
autor = models.CharField(max_length=100)
fecha_publicacion = models.DateField()
isbn = models.CharField(max_length=13, null=True, blank=True)
Crea la migración:
python manage.py makemigrations
Aplica la migración:
python manage.py migrate
3. Ver el historial de migraciones aplicadas:
python manage.py showmigrations
makemigrations
después de realizar cambios en los modelos.
Para más detalles sobre las migraciones en Django, puedes consultar la documentación oficial de Django.
Jorge García
Fullstack developer