Cómo hacer en Django una migración manual en producción

written by uve 26 November 2010

Últimamente tengo aún menos tiempo, ya que estoy aprovechando PlagaOS para actualizar los módulos de MenudoProblema y crear algunos módulos que incorporaré más adelante. Pero aquí os dejo un pequeño problema:tras explorar la limitaciones de Django FlatPages decidí hacerme mi propio módulo de páginas estáticas. Lo desarrollé, lo incluí en la página del proyecto, hice el despliegue y como no, acabé haciendo un cambio en el modelo.

Supongamos el siguiente modelo:

class StaticPage(models.Model):
    title = models.CharField(_(u'Title'), max_length=90)
    content = models.TextField(_(u'Content'))
    ...

Y queremos añadir un campo más:

class StaticPage(models.Model):
    title = models.CharField(_(u'Title'), max_length=90)
    content = models.TextField(_(u'Content'))
    ...
    on_menu = models.BooleanField(_(u'Is this entry included on menu?'), default=True)

¿Cómo hacer la migración? Lo primero veamos el SQL para el nuevo modelo:

$ python manage.py sql paginas
BEGIN;CREATE TABLE `paginas_staticpage` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `title` varchar(90) NOT NULL,
    `content` longtext NOT NULL,
    ...
    `on_menu` bool NOT NULL
)
;
...

Lo siguiente es modificar nuestra tabla en la base de datos:

$ python manage.py dbshell
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is xxx
Server version: 5.1.41 (Ubuntu)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> ALTER TABLE `paginas_staticpage` ADD (`on_menu` bool NOT NULL);
Query OK, 2 rows affected (0.06 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> quit
Bye

Y por último, modificamos nuestro modelo (models.py), añadiendo el nuevo campo. Ahora ya depende del servidor Web que tengamos, en mi caso Apache2. Le vamos a indicar que hay cambios:

$ sudo service apache2 reload

Y si todo ha ido bien, debe de seguir todo como estaba y nadie ha notado nada :)

Tags

La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.