Django-South ayuda a actualizar la base de datos en desarrollo y producción

Django 23 October 2009 | 2 Comments

Desde que se inicia en la aventura de desarrollar aplicaciones con Python/Django encontramos que podemos mapear las tablas de la base de datos desde una clase modelo (lo que equivale en Java a un bean de entidad).

Todo buen desarrollo de aplicaciones tipo database-driven debe contemplar en sus inicios de una buena craneada del diseño modelo relacional, pero a medidas de que va escalando, o como sucede frecuentemente, el levantamiento de información del proyecto esta incompleta, lo cual apunta a refactorizar las clases modelos implicadas con el cambio.

He aquí un problema interesante, con Django si vas a actualizar una clase (que equivale a una tabla), como por ejemplo, agregarle un nuevo atributo, debes entendértelas con el motor de base de datos también :S (no aguanta, cambiar aqui, cambiar alla, quitar aca :S), gracias a South nos ahorramos estas empanadas sobretodo en producción :) .

Que es South? es como un versionamiento & migración de los esquemas de las bases de datos (equivale a mutations en RoR y otros ) como? ahora manage.py syncdb actualizara hasta lo mas mínimo a nivel de cada clase del models.py, desde colocar una columna en siempre NULL hasta agregar un constraint :D

Como se usa?

-Bajar, Instalar, Adjuntarlo en el INSTALLED_APPS del settings.py de la aplicación….y listo, nada mas!

-Empezar a usarlo para versionar nuestros esquemas, por lo general South se deberia implementar desde que nacen las aplicaciones , pero vamos a poner un entorno más comun en todos: “El desarrollo ya esta adelantado”

Suponiendo que tenemos esta clase:

#app: productos
#archivo: productos.py

from django.db import models
class Producto(models.Model):
nombre = models.CharField(max_length=50)
descripcion = models.TextField()
inventario =  models.IntegerField(‘Cantidad en inventario’, default=0)

Debemos versionar la primera version de la siguiente manera:

# manage.py convert_to_south productos
+ Added model ‘productos.Producto’
- Soft matched migration 0001 to 0001_initial
Running migrations for productos:
- Migrating forwards to 0001_initial.
> productos: 0001_initial

# manage.py syncdb (y veras que diferente se ve :) )

Esto ha creado 0001_initial.py dentro del modulo, su contenido es muy claro, en el método forwards() tiene el mapeo actual de la version del esquema. y el metodo backwards() tiene el mapeo anterior de la version actual.

Preguntas hasta aqui?. Ok.

“Los productos pueden ser inactivados en algún momento y mejor que no sea obligatorio establecer un inventario, que pena no aclarar  (~.~)” – Dice el stackeholder del proyecto.
Tenga más cuidado (¬.¬)” -Dice el jefe de proyecto.
“(@_@’)” – Queda el desarrollador y hace el cambio correspondiente:

#app: productos
#archivo: productos.py

from django.db import models
class Producto(models.Model):
nombre = models.CharField(max_length=50)
descripcion = models.TextField()
inventario =  models.IntegerField(‘Cantidad en inventario’, default=0, blank=True, null=True)
estado = models.BooleanField(‘Producto esta activo?’, default=True)

Y hacemos el versionamiento:

#   manage.py startmigration productos nuevo_campo_estado –auto
+ Added and modified fields
Created 0002_nuevo_campo_estado.py

Listo tenemos la versión, describo el comando:
manage.py startmigration nombre_aplicacion nombre_migracion –estilo_migracion

Hagamos el syncdb:

# manage.py syncdb
Syncing…

Synced:
- algunas.aplicaciones
- south

Not synced (use migrations):
- site.productos
(use ./manage.py migrate to migrate these)

Nos dice que debemos migrar productos en la base de datos :D , hagamoslo:

# manage.py migrate
Running migrations for productos:
- Migrating forwards to 0002_nuevo_campo_estado.
– productos: 0002_nuevo_campo_estado
- Loading initial data for productos.

Listo, ahora la base de datos debería haber tomado los cambios :D , y problema resuelto, ahora solo esperamos que los commiters de Djangoproject incluyan este modulo en sus paquete oficiales.

Hasta la version 0.6 no detecta cambio de nombres de columnas, pero lo hará pronto porque la comunidad Django es muy agil mejorando sus juguetes.

En el siguiente post, vamos a hacer backward, echarnos para atras en la version de la tabla productos.

Para mayor informacion: http://south.aeracode.org/
Otro tutorial: http://south.aeracode.org/wiki/Tutorial1

saludos.

Tagged in , , , , , , , , , ,

2 Responses on “Django-South ayuda a actualizar la base de datos en desarrollo y producción”

  1. The writer of panchicore.esticate.com has written a superior article. I got your point and there is nothing to argue about. It is like the following universal truth that you can not disagree with: If its says “you must restart your system” its lying. I will be back.

  2. panchicore says:

    Thanks for the comment. I’ll be writing more experiencies with next souths versions.

Leave a Reply

Better Tag Cloud