Migraciones con Django

Juan David Hernandez G

Developer and Tech Lead

                                                                                                           @JuanDHernandezG

                                                                                                                   https://co.linkedin.com/in/juandhernandez

 

Migraciones, cómo funcionan y cómo sacarles el máximo provecho

 

Los problemas que las migraciones resuelven

  • Los cambios en el schema de la base de datos se hacen de manera más ágil y rápida.

  • Facilita el manejo de git para el seguimiento a los cambios en el schema de nuestra base de datos.

  • Proporciona un camino adecuado para mantener los datos de los fixtures vinculados al schema adecuado.

  • Mantiene el código y los schemas sincronizados.

En general, las migraciones permiten gestionar y trabajar con el schema de la base de datos de la misma manera que lo haría con su código en Django.

Introducción a las migraciones

Creamos el modelo...

Crear las migraciones

./manage.py makemigrations historical_data
Migrations for 'historical_data':
  0001_initial.py:
    - Create model PriceHistory

Si queremos darle un nombre a nuestra migración...

./manage.py makemigrations historical_data --name myfirstmigration

Aplicar las migraciones

./manage.py migrate

Flujo de trabajo

  • Crear o actualizar un modelo 
  • Crear la migración
  • Aplicar las migraciones
  • Repetir el proceso

Aplicando migraciones a un proyecto existente...

  • Eliminar todos los archivos de migraciones.
  • Ejecutar makemigrations. Django creará las migraciones iniciales en base a los modelos actuales.
  • Ejecutar migrate. Django aplica las migraciones.

Si queremos migrar desde una versión anterior de Django (south):

./manage.py migrate --fake <appname>
./manage.py migrate --fake-initial <appname>

South vs Django migrations

Pasos South Django migrations
Migración inicial 1. run syncdb
2. schemamigration <appname> --initial
makemigrations <appname>
Ejecución de las migraciones migrate <appnam> migrate <appname>
Otras migraciones schemamigration <appname> --auto makemigrations <appname>

Profundizando en las migraciones

Por defecto, Django nunca ejecuta una migración más de dos veces en la misma base de datos.

Deshacer las migraciones...

./manage.py migrate historical_data zero

El archivo migraciones...

Dependencias de las migraciones

En la primera lista del archivo encontramos una lista de migraciones que se deben ejecutar antes de la migración.

dependencies = [
    ('main', '0001_initial'),
]

Operaciones

La segunda lista del archivo contiene una lista de las operaciones que deben ser aplicadas como parte de la migración.

Estas operaciones pueden ser las siguientes:

  • CreateModel: crea un modelo.

  • DeleteModel: elimina una tabla en la base de datos.

  • RenameModel: renombra una tabla

  • AlterModelTable: cambia el nombre de la tabla asociada a un modelo. Igual que la opción db_table

  • AlterUniqueTogether: cambia restricciones únicas en la tabla.

  • AlterIndexTogether: cambia el conjunto de índices personalizados para el modelo.

  • AddField: adiciona una columna a la tabla.

  • RemoveField: elimina una columna de la tabla.

  • RenameField: renombra una columna de la tabla.

Hay unas pocas operaciones ‘especiales’:

  • RunSQL: permite pasar sql crudo y ejecutarlo como parte del modelo.

  • RunPython: requerimiento a ejecutar. Útil para la carga de datos como parte de la migración.

Continuamos con el ejemplo...

Definir migraciones de datos

Las migraciones de datos son usadas en numerosos escenarios. Dos muy populares son:

  • Cuando se requiere cargar de datos la aplicación para que funcione correctamente.
  • Cuando un cambio en el modelo de datos obliga a realizar cambios en los datos existentes.

Continuamos con el ejemplo...

./manage.py makemigrations --empty historical_data
# encoding: utf8
from django.db import models, migrations


class Migration(migrations.Migration):

    dependencies = [
        ('historical_data', '0002_auto_20140710_0810'),
    ]

    operations = [
    ]

Usando RunPython...

Conclusión...

  • Estos son los escenarios más comunes a la hora de utilizar las migraciones.

  • Para explorar otros escenarios con más profundidad, remitirse a la documentación.

De manera general las migraciones se utilizan para:

  • Cambio en la estructura de la base de datos sin cambios en los datos. Es el tipo más común y Django genera estas migraciones de manera automática.

  • Cambio a los datos y carga de nuevos datos. Estos se deben generar manualmente a través de la opción RunPython.

Repositorio en GitHub del ejemplo aquí

 

Made with Slides.com