Utilizando Django para hacer la migración

written by uve 18 September 2010

Cuando tenemos un sitio en producción y realizamos una migración, la situación es delicada. Además he cambiado de PostgreSQL a MySQL (ya comentaré las razones), lo cual complica la cosa. Es necesario hacer volcados de las tablas y los contendidos desde PostgreSQL y hacer la importación desde MySQL. Lo más sencillo es aprovechar las posibilidades que ofrece Django.

Ya comenté algo acerca de esto, los fixtures, pero con otra finalidad. En este caso, en lugar de realizar la exportación de una aplicación, lo haremos de todo el proyecto.

python manage.py dumpdata > backup.json

El problema vino cuando intenté realizar la carga de datos en el nuevo servidor.

$ python manage.py loaddata backup.json 
Installing json fixture 'backup' from absolute path.
Problem installing fixture 'backup.json': Traceback (most recent call last):
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/commands/loaddata.py", line 169, in handle
    obj.save(using=using)
  File "/usr/local/lib/python2.6/dist-packages/django/core/serializers/base.py", line 165, in save
    models.Model.save_base(self.object, using=using, raw=True)
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/base.py", line 528, in save_base
    result = manager._insert(values, return_id=update_pk, using=using)
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/manager.py", line 195, in _insert
    return insert_query(self.model, values, **kwargs)
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 1479, in insert_query
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py", line 783, in execute_sql
    cursor = super(SQLInsertCompiler, self).execute_sql(None)
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py", line 727, in execute_sql
    cursor.execute(sql, params)
  File "/usr/local/lib/python2.6/dist-packages/django/db/backends/util.py", line 15, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python2.6/dist-packages/django/db/backends/sqlite3/base.py", line 200, in execute
    return Database.Cursor.execute(self, query, params)
IntegrityError: columns app_label, model are not unique

Tras mucho leer y darle vueltas al asunto llegué al problema. El problema viene con django.contrib.contenttypes, que automáticamente añade información sobre los modelos de las aplicaciones instaladas. Esta información es utilizada por Django para hacer relaciones genéricas.

Los pasos a seguir para solucionar el problema son los siguientes:


$ python manage.py syncdb
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table auth_message
Creating table django_admin_log
Creating table django_content_type
Creating table django_session
Creating table django_comments
Creating table django_comment_flags
Creating table django_site
...

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): no
Installing index for auth.Permission model
Installing index for auth.Group_permissions model
Installing index for auth.User_user_permissions model
Installing index for auth.User_groups model
Installing index for auth.Message model
Installing index for admin.LogEntry model
Installing index for comments.Comment model
Installing index for comments.CommentFlag model
...
No fixtures found.

Reseteamos la tabla contenttypes:

$ python manage.py reset contenttypes

You have requested a database reset.
This will IRREVERSIBLY DESTROY any data for
the "contenttypes" application in the database "midatabase".
Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel: yes

Y ahora sí, podemos importar los datos:

$ python manage.py loaddata backup.json

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é.