uma implementação de suporte a
DESCRIPTION
TRANSCRIPT
Implementação de Acesso a múltiplos Bancos de dados no Django 1.1.
Rômulo Jales - [email protected]
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