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



           Rômulo Jales - rjales@fitec.org...
Agenda
●   O que é Django?
    ●   Um rápido Tutorial
●   A necessidade
●   A solução
O que é Django?
●   Um framework web de alto nível
●   Escrito em Python
●   Estimula o desenvolvimento rápido e limpo
●  ...
O que é django?
Um rápido tutorial
●   Crie um projeto:
    ●   django-admin startproject NOME_PRJ
    ●   São criados 4 arquivos:
       ...
Um rápido tutorial
●   settings.py
    ●   Armazena as configurações do serviço
    ●   O banco de dados é configurado aqu...
Um rápido tutorial
●   ./manager startapp NOME_DA_APP
    ●   São criados 4 arquivos
        –   init.py
        –   model...
Um rápido tutorial
●   models.py → acesso aos dados
●   views.py → Tratamento das requisições da
    aplicação.
Um rápido tutorial
●   Código para models.py
    from django.db import models
    class Artigo(models.Model):
      titulo...
Um rápido tutorial
●   Crie um arquivo chamado admin.py
    from django.contrib import admin
    from models import Artigo...
Um rápido tutorial
Um rápido tutorial
●   Sincronize o banco.
    ●   ./manager syncdb
Um rápido tutorial
Quem usa o django?
●   globo.com
●   washingtonpost.com
●   E outros 3575 cadastrados no
    http://www.djangosites.org/!
A necessidade
●   Acessar vários banco de dados usando a
    versão em produção 1.1 do cliente.
A necessidade
●   Solução de acesso atual (na view.py)

    mssql = _mssql.connect('IP_DO_SERVER','linux','SENHA')
    que...
A necessidade
●   Solução quebra a arquitetura!!!!!!
●   Não é DRY!
●   Não é simples!
●   Se o IP do banco mudar?
●   Se ...
A solução
●   Premissas e restrições:
    ●   Não pode mudar o que já funciona!
    ●   Usar o conceito de DRY
    ●   Fun...
A solução - análise
connection = backend.DatabaseWrapper({


‘DATABASE_HOST’: settings.DATABASE_HOST,
‘DATABASE_NAME’: set...
A solução - análise
●   Models
    ●   Tem um atributo _default_manager (Manager)
●   Manager
    ●   Tem um método centra...
A solução
●   Permitir indexação dos parâmetros
    DATABASE_*
    ●   Modificar a classe QuerySet!!
A solução
from django.db.models import sql
from django.db.models.sql.where import WhereNode
from utils import getConnectio...
A solução
from django.conf import settings
from django.db import load_backend

def getConnection(banco):
  engine = settin...
A solução
from django.db.models import sql
from django.db.models.manager import Manager
from django.db.models.query import...
A solução – visão do usuário
●   Adicionar no settings.py um dicionário
    chamado
    SECONDARY_DB contendo as configura...
Correção da gambiarra - antes

def get_op_from_scf(serial):
  import _mssql

  mssql = _mssql.connect('IP_DO_SERVER','linu...
Correção da gambiarra - depois
class OPLEGADO(Model):
   class Meta:
      db_table = "CONSULTA_OP"
      managed = False
...
Limitações
●   Não sincroniza todos os bancos
    simultaneamente!
●   Inicialização mais demorada
●   Funciona apenas par...
Upcoming SlideShare
Loading in...5
×

Implementação de

600

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
600
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
5
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Implementação de "

  1. 1. Implementação de Acesso a múltiplos Bancos de dados no Django. Rômulo Jales - rjales@fitec.org.br
  2. 2. Agenda ● O que é Django? ● Um rápido Tutorial ● A necessidade ● A solução
  3. 3. 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”
  4. 4. O que é django?
  5. 5. Um rápido tutorial ● Crie um projeto: ● django-admin startproject NOME_PRJ ● São criados 4 arquivos: – __init__.py – settings.py – manage.py – urls.py
  6. 6. Um rápido tutorial ● settings.py ● Armazena as configurações do serviço ● O banco de dados é configurado aqui! ● urls.py ● Realiza o roteamento das urls para os métodos e recursos ● manager.py ● Gerenciador local do django.
  7. 7. Um rápido tutorial ● ./manager startapp NOME_DA_APP ● São criados 4 arquivos – init.py – models.py – view.py – tests.py
  8. 8. Um rápido tutorial ● models.py → acesso aos dados ● views.py → Tratamento das requisições da aplicação.
  9. 9. Um rápido tutorial ● Código para models.py from django.db import models class Artigo(models.Model): titulo = models.CharField(max_length=100) conteudo = models.TextField() publicacao = models.DateTimeField()
  10. 10. Um rápido tutorial ● Crie um arquivo chamado admin.py from django.contrib import admin from models import Artigo admin.site.register(Artigo) ● Edite a urls.py (r'^$', 'django.views.generic.date_based.archive_index', {'queryset': Artigo.objects.all(), 'date_field': 'publicacao'}), (r'^admin/(.*)', admin.site.root),
  11. 11. Um rápido tutorial
  12. 12. Um rápido tutorial ● Sincronize o banco. ● ./manager syncdb
  13. 13. Um rápido tutorial
  14. 14. Quem usa o django? ● globo.com ● washingtonpost.com ● E outros 3575 cadastrados no http://www.djangosites.org/!
  15. 15. A necessidade ● Acessar vários banco de dados usando a versão em produção 1.1 do cliente.
  16. 16. A necessidade ● Solução de acesso atual (na view.py) mssql = _mssql.connect('IP_DO_SERVER','linux','SENHA') query = "SELECT OP FROM CONSULTA_OP WHERE NUMEROSERIE = '"+serial+"'" mssql.query(query)
  17. 17. A necessidade ● Solução quebra a arquitetura!!!!!! ● Não é DRY! ● Não é simples! ● Se o IP do banco mudar? ● Se o backend do banco mudar?
  18. 18. A solução ● Premissas e restrições: ● Não pode mudar o que já funciona! ● Usar o conceito de DRY ● Funcionar com todos os backends nativos do Django (mysql, postgres, sqlite3) e o **SQL SERVER**
  19. 19. A solução - análise connection = backend.DatabaseWrapper({ ‘DATABASE_HOST’: settings.DATABASE_HOST, ‘DATABASE_NAME’: settings.DATABASE_NAME, ‘DATABASE_OPTIONS’: settings.DATABASE_OPTIONS, ‘DATABASE_PASSWORD’: settings.DATABASE_PASSWORD, ‘DATABASE_PORT’: settings.DATABASE_PORT, ‘DATABASE_USER’: settings.DATABASE_USER, ‘TIME_ZONE’: settings.TIME_ZONE, })
  20. 20. A solução - análise ● Models ● Tem um atributo _default_manager (Manager) ● Manager ● Tem um método central get_query_set (QuerySet). Método que acessa o backend ● QuerySet ● Tem um atributo query do tipo Query, que é instancia de DataBaseWrapper, que é uma classe abstrata definida pela parametrização contida em settings.py
  21. 21. A solução ● Permitir indexação dos parâmetros DATABASE_* ● Modificar a classe QuerySet!!
  22. 22. A solução from django.db.models import sql from django.db.models.sql.where import WhereNode from utils import getConnection class MultiBdQuery(sql.Query): def __init__(self, model, banco): self.banco = banco self.connection = getConnection(self.banco) super(MultiBdQuery, self).__init__(model, self.connection, WhereNode) def __setstate__(self, obj_dict): obj_dict['select_fields'] = [ name is not None and obj_dict['model']._meta.get_field(name) or None for name in obj_dict['select_fields'] ] self.__dict__.update(obj_dict) self.connection = getConnection(self.banco)
  23. 23. A solução from django.conf import settings from django.db import load_backend def getConnection(banco): engine = settings.SECONDARY_DB[banco]['DATABASE_ENGINE'] if engine == "sql_server.pyodbc": backend = __import__(engine+'.base', {}, {}, ['base']) else: backend = load_backend(engine) return backend.DatabaseWrapper(settings.SECONDARY_DB[banco])
  24. 24. A solução from django.db.models import sql from django.db.models.manager import Manager from django.db.models.query import QuerySet from query import MultiBdQuery class MultiBdManager(Manager): use_for_related_fields = True def __init__(self, banco, *args, **kwargs): super(MultiBdManager, self).__init__(*args, **kwargs) self.banco = banco def get_query_set(self): #Obtem um novo query a partir das configuracoes de banco query = MultiBdQuery(self.model, self.banco) return QuerySet(self.model, query)
  25. 25. A solução – visão do usuário ● Adicionar no settings.py um dicionário chamado SECONDARY_DB contendo as configurações dos outros bancos ● Novos modelos ● Modificar o Manager padrão, passando o nome do banco de qual a classe está associada.
  26. 26. Correção da gambiarra - antes 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()
  27. 27. Correção da gambiarra - depois 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))
  28. 28. Limitações ● Não sincroniza todos os bancos simultaneamente! ● Inicialização mais demorada ● Funciona apenas para versões >= 1.1 do Django.
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×