En el post previo, habíamos citado la aplicación de django south.

South es una herramienta que nos ayudará con las migraciones del modelo de datos, para evitar que tengamos errores cada vez que modificamos campos de algún modelo si no queremos borrar la base de datos existente y reemplazarla por una nueva.

El proceso habitual para crear la base de datos es ejecutar el siguiente comando (hazlo):

(mientorno)$ ./manage.py syncdb

El problema es que una vez hemos hecho esto, y hemos empezado a meter datos en las tablas, las modificaciones del modelo de datos podrían derivar en inconsistencias y errores. Para evitarlo, usamos south.

Instalando South

Antes de nada, recordemos como se instala south:

(mientorno)$ pip install south

Vinculando south a nuestra aplicación

Para usar south en nuestro proyecto deberemos ir al fichero settings.py (recordemos la jerarquía de un proyecto Django:)

– miProyecto
      – db.sqlite3
      – manage.py
      – miaplicacion
            – …
      – miProyecto
            – __init__.py
            – urls.py
            – wsgi.py
            – settings.py

 y añadir south a las installed apps:

INSTALLED_APPS = (
    ‘django.contrib.admin’,
    ‘django.contrib.auth’,
    ‘django.contrib.contenttypes’,
    ‘django.contrib.sessions’,
    ‘django.contrib.messages’,
    ‘django.contrib.staticfiles’,
    ‘miaplicacion’,
    ‘south’,  

)

Volvemos a ejecutar syncdb a ver que pasa:

(mientorno)$ ./manage.py syncdb
 Syncing…
 Creating tables … 
 Creating tables south_migrationhistory
     etc etc etc
 Not synced (use migrations) 

Lo que nos está diciendo es que ahora tenemos que usar south para gestionar las migraciones del modelo de datos.

Para poder usar south con miaplicacion, tendré que ejecutar el comando de manage.py que genera la estructura de migraciones dentro de miaplicacion, del siguiente modo:

ADVERTENCIA: Al ejecutar el siguiente comando, los modelos de datos deben seguir igual que cuando se generó la BBDD (con syncdb), es decir, no lo habremos modificado. De lo contrario, saltarán errores

(mientorno)$ ./manage.py convert_to_south miaplicacion

Veremos que tras ejecutar este comando, se nos ha añadido una nueva carpeta en el directorio miaplicacion, denominada migrations.

– miProyecto
      – db.sqlite3
      – manage.py
      – miaplicacion
            – migrations
            – …
      – miProyecto
            – __init__.py
            – urls.py
            – wsgi.py
            – settings.py

En caso de error (probablemente motivado por lo que se comenta en la advertencia anterior), la mejor forma de solucionarlo es eliminar la carpeta migrations, y eliminar también la base de datos db.sqlite3, y generar de nuevo la base de datos, con el comando syncdb. Después podremos volver a usar el convert_to_south para llegar al punto que deseábamos.



Ejecutando una migración


Una vez south está vinculado, podemos hacer un cambio en algún modelo de datos de nuestra aplicación, y acto seguido, incorporarlo a la base de datos mediante south.

En primer lugar, le pedimos que genere el esquema de migración (le pediremos que lo genere de forma automática).

(mientorno)$ ./manage.py schemamigration miaplicacion –auto

Esto nos dirá si se tiene que añadir algun campo, eliminarlo, etc. para que revisemos que los cambios que propone son los que queremos hacer.

Acto seguido, le pedimos que aplique los cambios.

(mientorno)$ ./manage.py migrate miaplicacion

Con esto, deberíamos haber actualizado sin problemas nuestro modelo de datos. Si estabamos usando django-admin, podemos comprobarlo ejecutando el servidor de desarrollo, y entrando en el panel de administración para ver los cambios.