South: Migraciones en Django

Cuando escribí el artículo sobre Django, fui bastante positivo con respecto al sistema de llevar los modelos a la base de datos, ya que, según parecía, el sistema propuesto por syncdb era automágico, pero realmente, lo único que se encarga de realizar es la creación de nuevos modelos que estén en el fichero de models.py.

ACTUALIZACIÓN 2014–03–24: hoy he recibido la noticia de que South (su funcionalidad) ha pasado a formar parte de la nueva versión de Django 1.7. Tal y como se ve en su documentación: Migraciones

Entonces, si estamos desarrollando y, por arte y gracia del destino necesitamos de una nueva columna en una tabla… y peor aún, si el sistema ya está en producción, ¿cómo lo hacemos?

¡South al rescate!

South es un sistema de migraciones parecido al que viene con Rails, solo que: es automático.

El sistema se basa en la creación (y activación) del sistema de migraciones por aplicación. Cuando se activa, se crea un subdirectorio de migrations en la aplicación, donde se almacenan ficheros de migración. En principio, se agregan las migraciones necesarias para la creación de los modelos que se hayan agregado en el fichero models.py nada más comenzar.

Esto se consigue, antes de ejecutar el comando syncdb, algo como esto:

./manage.py schemamigration myapp --initial

Siendo myapp el nombre de la aplicación sobre la que se quiere activar el sistema de migraciones.

Y en el momento que se tenga que cambiar alguna de las tablas, para realizar la agregación o cambio de algún campo (o la eliminación, claro), tan solo hay que grabar el fichero models.py con el cambio y ejecutar en consola:

./manage.py schemamigration myapp --auto

En este punto, el sistema agrega una migración con los cambios a insertar en la base de datos para realizar el cambio del estado de las tablas en la versión anterior para adecuarlo a la definición actual.

Cuando se ejecuta syncdb el sistema informa de que no puede hacer nada con esa aplicación y que se debe de ejecutar migrate para realizar las migraciones. En este punto ya es donde se comienza a ver y notar el parecido con Rails, ya que el comando es exactamente el mismo, la única diferencia, es que no hemos tenido ni que crear ni que escribir ningún fichero (salvo el conocido models.py).

La única pega, de momento, con este sistema, es que si nos equivocamos, no podemos echar atrás una migración. La única forma de avanzar, al igual que con los sistemas de control de versiones, es deshacer lo que queramos en el fichero de models.py y volver a crear una nueva migración.

Desde el principio… ¿cómo se instala esto?

La parte buena, es que se instala fácilmente con el siguiente comando:

easy_install South

El paquete está publicado en el Cheese Shop, con lo que, se baja e instala de forma fácil. Para que esté disponible en nuestro proyecto, solo tenemos que agregarlo al settings.py (la aplicación south), y ya estarán disponibles los comandos para manage.py.

Si la aplicación sobre la que queremos usar las migraciones ya existe y se han creado modelos con syncdb, en caso de crear la primera migración, puede pasar que al ejecutar migrate, el sistema falle diciendo que la tabla que se intenta crear ya existe. Esto es porque, cuando el proyecto ya existe y se ha usado syncdb para la aplicación en concreto, necesita la ejecución del siguiente comando a nivel de consola:

./manage.py convert_to_south myapp

Con esto, el sistema toma como realizada la migración inicial y puedes seguir a partir de ahí.

Conclusiones

Django es un buen sistema para desarrollo de aplicaciones web, como ya dije anteriormente. Como muchos otros frameworks para desarrollo de aplicaciones web, tiene sus carencias, pero afortunadamente, si se revisa un simple pip search django, donde puede observar que, aparte de lo que viene por defecto con Django, se pueden agregar muchas extensiones muy útiles al sistema… como South.