Volver a la página principal
miércoles 16 octubre 2024
47

Cómo usar migraciones en Django

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.

¿Qué es una migration en Django?

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.

Funcionalidades del sistema de migraciones

  • Crear tablas en la base de datos basadas en los modelos.
  • Modificar el esquema de las tablas (agregar, eliminar o modificar campos).
  • Migraciones automáticas generadas a partir de cambios en los modelos.
  • Migraciones inversas para deshacer cambios si es necesario.

Uso básico de las migraciones

1. Crear migraciones

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.

2. Aplicar migraciones

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.

3. Revisar el estado de las migraciones

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).

Ejemplos comunes de migraciones

Crear una tabla nueva

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

Modificar un campo en un modelo

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

Deshacer una migración

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

Migraciones automáticas y personalizadas

Django intenta generar las migraciones automáticamente, pero en algunos casos complejos, puede que necesites personalizar las migraciones.

Agregar una migración personalizada

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.

Algunos ejemplos

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

Buenas prácticas

  • Siempre ejecuta makemigrations después de realizar cambios en los modelos.
  • Aplica las migraciones a la base de datos de desarrollo antes de implementar en producción.
  • Revisa los archivos de migración generados para asegurar que los cambios reflejan correctamente lo que necesitas.

Referencia oficial

Para más detalles sobre las migraciones en Django, puedes consultar la documentación oficial de Django.

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer