Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Django e conexões de banco de dados somente leitura


Eu encontrei o mesmo problema (usando o Django 1.11) e essa pergunta estava no topo dos meus resultados do Google.

Sua solução inicial está faltando apenas uma peça crítica. Você precisa dizer ao Django quais modelos de banco de dados 'C' e 'D' estão usando. O que funcionou para mim:
class ExternalModel(models.Model):
    class Meta:
        managed = False
        abstract = True    
        app_label = 'support'

Em seguida, diga ao seu roteador de banco de dados como se comportar quando encontrar esse app_label na seção allow_migrate():
    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == 'support':
            return False
        return (db == 'default')

Não tenho certeza se essa é a solução mais correta aos olhos da equipe do Django, mas o efeito é allow_migrate() retornando False para qualquer modelo definido com esse valor de atributo app_label.

A documentação do Django sobre roteadores não menciona isso explicitamente (ou, pelo menos, com exemplos de código de modelo que deixam claro como o ORM passa o valor de 'db' para allow_migrate()), mas entre os atributos 'app_label' e 'managed' você pode obtê-lo trabalhar*.

* No meu caso o padrão é postgres e o banco de dados somente leitura é Oracle 12 via cx_Oracle.