Uma implementação de suporte a

Post on 18-Dec-2014

1.076 views 1 download

description

 

Transcript of Uma implementação de suporte a

Implementação de Acesso a múltiplos Bancos de dados no Django 1.1.

Rômulo Jales - romulo@romulojales.comwww.romulojales.com

Quem vos fala?

● Engenheiro da Computação● FITec ● Envolvimentos:– Linux– Embarcados– Sistemas Distribuídos– Python– C– ShellScript

Agenda

● O que é Django?● Análise do caso● A solução● Resultados● Demonstração

O que é Django?

● Um framework web de alto nível● Escrito em Python● Estimula o desenvolvimento rápido e limpo● Implementa o conceito DRY

“Um framework para perfeccionistas com deadlines”

● www.djangoproject.org

Quem usa o django?

● globo.com● washingtonpost.com● E outros 3575 cadastrados no

http://www.djangosites.org/!

O que é django?

Análise de caso

● O que eu quero?● Como o Django acessa um banco?● Quem são as classes e entidades?● Tenho know how para propor uma solução?

O que eu quero? Qual a minha necessidade? O que eu tenho?

Django 1.1

● Não acessa múltiplos bandos de dados● Versão homologada em produção● Acesso a bancos legados● Sistema heterogêneo– Postgresql e MS SqlServer

Como o Django acessa um banco?

● Classes do tipo Model● Model <= Managers

A Manager is the interface through which database query operations are provided to Django models. At least one Manager exists for every model in a Django application.

● Atributo object é um manager– FOO.object.get_all()

Managers

● Como o Manager se conecta com um banco?● Classe de interface? E a implementação?● Tudo se resume ao método get_query_set

QuerySet

● Represents a lazy database lookup for a set of objects.

● Obejo query, inicialização:– Instância de Model– django.db.connection

● django/db/__init__.py

django.db.connection

DataBaseWrapper

● Instância de backend de banco● load_backend(settings.DATABASE_ENGINE

)● Daqui para frente é específico ao banco

Recapitulando

ModelManager

QuerySetquery

Settings

O que preciso fazer?

● Indexar as conf de banco no settings e ler!● Estruturar a informação● Reusar as classes existentes● Manter compatibilidade

Novas infraestrutura

● QuerySet– Permitir que query aceite um banco por parâmetro

● Manager– Usar o novo QuerySet

MultiBDManager

MultiBDBaseQuery

E para o usuário?

● github.com/romulojales/django-multidb● Copie na raiz do seu projeto ● Configurar no settings.py os novos bancos● Crie um dicionário SECONDARY_DB– Chave é o banco– Valor é um dicionário com as configurações do

banco, tal qual o padrão.

E para o usuário?

● Na classe model:● _default_manager =

MultiBdManager(“BANCO”)

Resultados

def get_op_from_scf(serial): import _mssql

mssql = _mssql.connect('IP_DO_SERVER','linux','SENHA')

query = "SELECT OP FROM CONSULTA_OP WHERE NUMEROSERIE = '"+serial+"'"

mssql.query(query) ret = mssql.fetch_array()

If ret[0][1] == 0: raise Exception("Nao existe nenhuma OP para o numero de serie informado: " + str(serial))

op = ret[0][2][0][0]

return op.strip()

Resultados

class OPLEGADO(Model): class Meta: db_table = "CONSULTA_OP" managed = False _default_manager = MultiBdManager("scf") op = CharField(max_length=13,primary_key=True) numeroserie = CharField(max_length=26)

def get_op_from_scf(serial):op = OPLEGADO.objects.get(numeroserie=serial)If op:

return opelse:

raise Exception(“"Nao existe nenhuma OP para o numero de serie informado: " + str(serial))

Limitações

● Não sincroniza todos os bancos simultaneamente!

● Funciona apenas para versões >= 1.1 do Django.

Futuro

Terminar implementação dos sinais:– O usuário precisará apenas do objeto

sec_db_name● Django 1.2 implementa multibd

MultiBd no 1.2

● http://docs.djangoproject.com/en/1.2/topics/db/multi-db/● CRUD, parametro using● settings.py -> Databases● Objeto connections virou um dicionário● Não sincroniza todos os BD simultaneamente

Demonstração