Mysql
 sql >> Base de données >  >> RDS >> Mysql

Django et connexions à la base de données en lecture seule

J'ai rencontré le même problème (en utilisant Django 1.11) et cette question était en tête de mes résultats Google pour cela.

Votre solution initiale ne manque qu'une seule pièce essentielle. Vous devez indiquer à Django quels modèles de base de données "C" et "D" utilisent. Ce qui a fonctionné pour moi :

class ExternalModel(models.Model):
    class Meta:
        managed = False
        abstract = True    
        app_label = 'support'

Ensuite, indiquez à votre routeur de base de données comment se comporter lorsqu'il rencontre ce app_label dans la section allow_migrate() :

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == 'support':
            return False
        return (db == 'default')

Je ne suis pas sûr que ce soit la solution la plus correcte aux yeux de l'équipe Django, mais l'effet est allow_migrate() renvoyant False pour tous les modèles définis avec cette valeur d'attribut app_label.

La documentation sur les routeurs de Django ne le mentionne pas explicitement (ou, au moins avec des exemples de code de modèle qui indiquent clairement comment l'ORM transmet la valeur de 'db' à allow_migrate()), mais entre les attributs 'app_label' et 'managed' vous pouvez l'obtenir travailler*.

* Dans mon cas, la valeur par défaut est postgres et la base de données en lecture seule est Oracle 12 via cx_Oracle.