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.
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:
- Habilitar la aplicaccion admin en
settings.py
. - Ejecutar
syncdb
para que se creen las tablas de esta aplicación. - 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