sql >> Databasteknik >  >> NoSQL >> MongoDB

Blanda PostgreSQL och MongoDB (som Django backends)

Sedan Django 1.2 kan du definiera flera databasanslutningar i din settings.py . Sedan kan du använda databasroutrar att tala om för Django vilken databas man ska gå till, öppet för din applikation.

Ansvarsfriskrivning: det är så jag tänker det borde fungera, jag har aldrig använt MongoDB i Django, och jag har inte heller testat att min kod faktiskt fungerar. :)

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django_mongodb_engine',
        'NAME': 'mydata',
        ...
    }
    'geodata' {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'geodata',
        ...
    }
}

DATABASE_ROUTERS = ['path.to.ModelMetaRouter']

Modeller

Lägg sedan till anpassade metavariabler till dina geo-tabeller för att åsidosätta deras databas. Lägg inte till detta attribut till modeller som är tänkta att gå till standarddatabasen.

class SomeGeoModel(models.Model):
    ...
    class Meta:
        using = 'geodata'

Databasrouter

Och skriv en databasrouter för att styra alla modeller som har using metaattributuppsättning, till lämplig anslutning:

class ModelMetaRouter(object):
    def db_for_read(self, model, **hints):
        return getattr(model._meta, 'using', None)

    def db_for_write(self, model, **hints):
        return getattr(model._meta, 'using', None)

    def allow_relation(self, obj1, obj2, **hints):
        # only allow relations within a single database
        if getattr(obj1._meta, 'using', None) == getattr(obj2._meta, 'using', None):
            return True
        return None

    def allow_syncdb(self, db, model):
        if db == getattr(model._meta, 'using', 'default'):
            return True
        return None


  1. Arbetar du med kapslade objekt i Redis?

  2. MongoDb med FastAPI

  3. MongoDB $sum Aggregation Pipeline Operator

  4. Vad betyder *((char*)-1) ='x'-koden?