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


     Rômulo Jales - romulo@romulojales.com
               www.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

Model
        Manager
                  QuerySet
                    query



                    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 op
     else:
          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

Uma implementação de suporte a

  • 1.
    Implementação de Acessoa 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 odjango? ● globo.com ● washingtonpost.com ● E outros 3575 cadastrados no http://www.djangosites.org/!
  • 6.
    O que édjango?
  • 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 euquero? 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 Djangoacessa 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
  • 13.
  • 14.
    DataBaseWrapper ● Instância de backend de banco ● load_backend(settings.DATABASE_ENGINE ) ● Daqui para frente é específico ao banco
  • 15.
    Recapitulando Model Manager QuerySet query Settings
  • 16.
    O que precisofazer? ● 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
  • 18.
  • 19.
  • 20.
    E para ousuá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 ousuá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
  • 27.