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
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.
Creamos el modelo...
./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
./manage.py migrate
Aplicando migraciones a un proyecto existente...
./manage.py migrate --fake <appname>
./manage.py migrate --fake-initial <appname>
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> |
./manage.py migrate historical_data zero
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:
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 = [
]
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.