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í
Migraciones con Django
By Juan David Hernández Giraldo
Migraciones con Django
- 4,442