Django - Troca de banco de dados de tempo de execução
No meu trabalho, queremos executar um servidor com vários bancos de dados. A alternância de bancos de dados deve ocorrer quando você acessa um URL comohttp://myapp.webpage.com
ouhttp://other.webpage.com
. Queremos executar apenas uma instância do servidor e, no momento da solicitação HTTP, alternar o banco de dados e retornar a resposta correspondente.
Estamos procurando uma solução sustentável e 'amigável ao Django'. Em nossa investigação, encontramos maneiras possíveis de fazer isso, mas não temos informações suficientes.
Opção 1: Middleware DjangoO middleware django é executado sempre que o servidor recebe uma solicitação HTTP.
Fazer uma troca de banco de dados aqui pode ser a melhor opção, mas usarroteadores de banco de dados django tanto quanto sei, só permite alterar o banco de dados para um modelo ou grupo ou modelos.
Outra opção é definir umgerente de modelo do django instância no middleware e forçar todos os modelos a atribuir novamente oobjects
atributo de um atributo adicionado no middleware customizado.
Minha última opção é criar um novo atributo no objeto de solicitação recebido pelo middleware que retorna odatabase alias
desettings.py
e em cada consulta de modelo use ousando o método.
Crie um mixin que use as três opções anteriores, mas euo mixin deve ser definido em TODAS as visualizações baseadas em classe. Se um programador esquecer de configurar o mixin e ele chegar a um servidor de produção, os dados poderão estar (ou deixar de estar) no banco de dados correto, e eu não quero correr o risco.
Opção 3: Alterando as Configurações do Banco de Dados em Tempo de ExecuçãoEsta opção funciona masNão é recomendado e é muito arriscado.
ATUALIZAR:Como isso funciona?middlewares.py
import django.conf as conf
import os.path
class SelectDB(object):
def process_request(self, request):
print request.META['HTTP_REFERER']
file_database = open("booklog/database.txt", "r")
database = file_database.read(10)
file_database.close()
if database != 'default':
conf.settings.DATABASES['default']['NAME'] = database
Qualquer informação que nos ajude a resolver será muito apreciada.