Gerando modelo de uma base legada

Postado por Rafael Sierra em 13/07/2007

Inspirado pelo post de Rodrigo Senra intitulado Criando tabelas dinamicamente no Django resolvi fazer algo um pouco mais flexivel[1] que possa ser usado em outras tabelas e outras views, então escrevi o seguinte código[2]:



[python]
# -*- encode: utf-8 -*-

from django.db import connection, get_introspection_module
from django.db import models

model_template = """
class %s(models.Model):
%s
class Meta:
db_table = "%s"

"""

def generate_model(table_name):
introspection_module = get_introspection_module()
cursor = connection.cursor()
table_description = introspection_module.get_table_description(cursor, table_name)
fields_list = []
for field in table_description:
if field[1] == 1403:
field_type = \
"%s(%s)"%(
introspection_module.DATA_TYPES_REVERSE[field[1]],
field[3]
)
else:
field_type = \
"%s()"%(introspection_module.DATA_TYPES_REVERSE[field[1]])
fields_list.append("%s = models.%s\n"%(field[0],field_type))
fields_str = " ".join(fields_list)
model_string = model_template%(table_name, fields_str, table_name)
exec model_string in globals()

__all__ = ['generate_model']
[/python]

Ele não está muito bem documentado, mas é bem auto-explicativo, então para testar, criei a seguinte view exemplo:

[sql]
-- Observacao: Essa view foi feita para PostgreSQL
SELECT au.id, au.username, ag.name AS "group"
FROM auth_user au
JOIN auth_user_groups aug ON aug.user_id = au.id
JOIN auth_group ag ON ag.id = aug.group_id;
[/sql]

Essa view simplesmente seleciona o nome do usuário junto com seu id e grupo. Em abri o terminal `python manage.py shell` e executei uns comandos:
[python]
from fuba.reverse import generate_model
import sys

modulo = 'user_group'
generate_model(modulo)
model = getattr(sys.modules['fuba.reverse'], modulo)
model.objects.all()[0].username
[/python]

O primeiro pensamento que veio na minha cabeça foi: "OMG! Isso funciona mesmo!!" :D

Have fun!

[1] - O post descreve como resolver um problema expecifico
[2] - O script foi salvo em "reverse.py" na raiz do projeto Django que se chama `fuba` (qualquer relação com "foo bar" é mera coicidencia)

Trackback URI | RSS dos comentários

Deixe um comentário

Av. Conselheiro Nébias, 368A, Cj. 413
Vila Mathias - Santos - SP
Telefone: (13) 3345-4580

© 2008 - 2009 Stiod. Todos os direitos reservados.