Algunos problemas y soluciones al levantar bases de datos legacy con Django

Este post fue migrado de un blog hecho con Wordpress. Si se ve mal, dejame un comentario y lo arreglo.

Con Django podemos levantar una base de datos legacy en lugar de definir nuestro modelo de datos y arrancar una aplicación desde cero. No es necesariamente una base de datos vieja, sino una base de datos heredada de otro sistema; puede ser de un sistema anterior que se está reemplazando o incluso de otro sistema que queremos usar de forma paralela.

Luego de configurar nuestra base de datos y ejecutar:

python manage.py inspectdb > models.py

obtenemos una definición de modelos basada en en las tablas de la base de datos. Lo siguiente es ver si anda.

Lo más probable es que obtengamos un NameError. Esto pasa cuando en la definición de alguno de los modelos se hace referencia a otro modelo aún no definido! La solución indicada es empezar a reordernar los modelos, pero una forma más fácil es cambiar los nombres por strings. Un ejemplo:

jefe = models.ForeingKey(Empleado)

por

jefe = models.ForeingKey('Empleado')

Otra queja que nos puede hacer Django es que tengamos atributos llamados id que no sean primary key. Solución: les cambiamos el nombre.

Eventualmente vamos a necesitar habilitar la aplicación admin (ya que estamos usando Django para levantar datos, nada mejor que usar su ABM estrella para ahorrarnos mucho trbajo). Los pasos para hacer con éxito son:

  1. Habilitar la aplicaccion admin en settings.py.
  2. Ejecutar syncdb para que se creen las tablas de esta aplicación.
  3. Agregar los modelos de la base de datos heredada al archivo admin.py de la aplicación.

Por supuesto, si los nuevos modelos son cientos, es bastante engorroso hacer esto a mano. Les paso un hack; así luce mi admin.py:

from django.contrib import admin

from django.db.models import base

from my_app.models import *



for k,v in locals().items():

    if isinstance(v, base.ModelBase):

        admin.site.register(v)

Tip final. Si obtenemos un error de este tipo:

OperationalError at /admin/mango/datapointusers/

(1054, "Unknown column 'dataPointUsers.id' in 'field list'")

es por que alguna de las tablas levantadas no tenía una columna que sea clave primaria. Django necesita esto para poder distinguir los objetos entre si. Para cada tabla dónde tengamos este problema, podemos ejecutar el siguiente comando SQL para agregarle una columna llamada id; clave primaria y auto numérico.

ALTER TABLE `dataPointUsers` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY;

Comentarios

Comments powered by Disqus