Este documento discute a implementação de acesso a múltiplos bancos de dados no Django 1.1. O autor apresenta uma solução que estende as classes existentes no Django para permitir que modelos acessem mais de um banco de dados, permitindo consultas em bancos legados. Ele demonstra como configurar e usar a extensão e discute limitações e melhorias futuras.
1. Implementação de Acesso a múltiplos
Bancos de dados no Django 1.1.
Rômulo Jales - romulo@romulojales.com
www.romulojales.com
2. Quem vos fala?
● Engenheiro da Computação
● FITec
● Envolvimentos:
– Linux
– Embarcados
– Sistemas Distribuídos
– Python
– C
– ShellScript
3. Agenda
● O que é Django?
● Análise do caso
● A solução
● Resultados
● Demonstração
4. 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
5. Quem usa o django?
● globo.com
● washingtonpost.com
● E outros 3575 cadastrados no
http://www.djangosites.org/!
7. 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?
8. O que eu quero? Qual a minha necessidade?
O que eu tenho?
9. 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
10. 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()
11. 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
12. 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
16. O que preciso fazer?
● Indexar as conf de banco no settings e ler!
● Estruturar a informação
● Reusar as classes existentes
● Manter compatibilidade
17. Novas infraestrutura
● QuerySet
– Permitir que query aceite um banco por parâmetro
● Manager
– Usar o novo QuerySet
20. 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.
21. E para o usuário?
● Na classe model:
● _default_manager =
MultiBdManager(“BANCO”)
22. 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()
23. 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 op
else:
raise Exception(“"Nao existe nenhuma OP para o numero de serie
informado: " + str(serial))
24. Limitações
● Não sincroniza todos os bancos
simultaneamente!
● Funciona apenas para versões >= 1.1 do
Django.
25. Futuro
Terminar implementação dos sinais:
– O usuário precisará apenas do objeto
sec_db_name
● Django 1.2 implementa multibd
26. 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