uma implementação de suporte a
DESCRIPTION
TRANSCRIPT
![Page 2: Uma implementação de suporte a](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/2.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/3.jpg)
Agenda
● O que é Django?● Análise do caso● A solução● Resultados● Demonstração
![Page 4: Uma implementação de suporte a](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/4.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/5.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/6.jpg)
O que é django?
![Page 7: Uma implementação de suporte a](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/7.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/8.jpg)
O que eu quero? Qual a minha necessidade? O que eu tenho?
![Page 9: Uma implementação de suporte a](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/9.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/10.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/11.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/12.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/13.jpg)
django.db.connection
![Page 14: Uma implementação de suporte a](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/14.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/15.jpg)
Recapitulando
ModelManager
QuerySetquery
Settings
![Page 16: Uma implementação de suporte a](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/16.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/17.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/18.jpg)
MultiBDManager
![Page 19: Uma implementação de suporte a](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/19.jpg)
MultiBDBaseQuery
![Page 20: Uma implementação de suporte a](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/20.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/21.jpg)
E para o usuário?
● Na classe model:● _default_manager =
MultiBdManager(“BANCO”)
![Page 22: Uma implementação de suporte a](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/22.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/23.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/24.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/25.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/26.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020723/54972b36ac7959182e8b5264/html5/thumbnails/27.jpg)
Demonstração