sql >> Database >  >> RDS >> Mysql

Django en alleen-lezen databaseverbindingen

Ik kwam hetzelfde probleem tegen (met Django 1.11) en deze vraag stond bovenaan mijn Google-resultaten ervoor.

Uw initiële oplossing mist slechts één cruciaal onderdeel. U moet Django vertellen welke databasemodellen 'C' en 'D' gebruiken. Wat werkte voor mij:

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

Vertel uw databaserouter vervolgens hoe hij zich moet gedragen wanneer hij dat app_label tegenkomt in de allow_migrate()-sectie:

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

Ik weet niet zeker of dit de meest correcte oplossing is in de ogen van het Django-team, maar het effect is allow_migrate() die False retourneert voor alle modellen die zijn gedefinieerd met die app_label-kenmerkwaarde.

De Django documentatie over routers vermeldt dit niet expliciet (of in ieder geval met modelcodevoorbeelden die duidelijk maken hoe de ORM de waarde voor 'db' doorgeeft aan allow_migrate()), maar tussen de 'app_label' en 'managed' attributen kun je het krijgen aan het werk*.

* In mijn geval is de standaard postgres en de alleen-lezen database Oracle 12 via cx_Oracle.



  1. Afstand tussen postcodes berekenen in PHP

  2. Gebruikers alleen toegang geven tot bepaalde tabellen in mijn inhoudsprovider

  3. Cronjob elke minuut

  4. Illegale mix van sorteringen MySQL-fout