27
Implementação de Acesso a múltiplos Bancos de dados no Django 1.1. Rômulo Jales - [email protected] www.romulojales.com

Uma implementação de suporte a

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Uma implementação de suporte a

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

Rômulo Jales - [email protected]

Page 2: Uma implementação de suporte a

Quem vos fala?

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

Page 3: Uma implementação de suporte a

Agenda

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

Page 4: Uma implementação de suporte a

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

Page 5: Uma implementação de suporte a

Quem usa o django?

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

http://www.djangosites.org/!

Page 6: Uma implementação de suporte a

O que é django?

Page 7: Uma implementação de suporte a

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?

Page 8: Uma implementação de suporte a

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

Page 9: Uma implementação de suporte a

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

Page 10: Uma implementação de suporte a

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()

Page 11: Uma implementação de suporte a

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

Page 12: Uma implementação de suporte a

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

Page 13: Uma implementação de suporte a

django.db.connection

Page 14: Uma implementação de suporte a

DataBaseWrapper

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

)● Daqui para frente é específico ao banco

Page 15: Uma implementação de suporte a

Recapitulando

ModelManager

QuerySetquery

Settings

Page 16: Uma implementação de suporte a

O que preciso fazer?

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

Page 17: Uma implementação de suporte a

Novas infraestrutura

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

● Manager– Usar o novo QuerySet

Page 18: Uma implementação de suporte a

MultiBDManager

Page 19: Uma implementação de suporte a

MultiBDBaseQuery

Page 20: Uma implementação de suporte a

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.

Page 21: Uma implementação de suporte a

E para o usuário?

● Na classe model:● _default_manager =

MultiBdManager(“BANCO”)

Page 22: Uma implementação de suporte a

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()

Page 23: Uma implementação de suporte a

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))

Page 24: Uma implementação de suporte a

Limitações

● Não sincroniza todos os bancos simultaneamente!

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

Page 25: Uma implementação de suporte a

Futuro

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

sec_db_name● Django 1.2 implementa multibd

Page 26: Uma implementação de suporte a

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

Page 27: Uma implementação de suporte a

Demonstração