MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mélanger PostgreSQL et MongoDB (en tant que backends Django)

Depuis Django 1.2, vous pouvez définir plusieurs connexions à la base de données dans votre settings.py . Ensuite, vous pouvez utiliser des routeurs de base de données pour indiquer à Django vers quelle base de données aller, de manière transparente pour votre application.

Avis de non-responsabilité : c'est comme ça que je pense cela devrait fonctionner, je n'ai jamais utilisé MongoDB dans Django, et je n'ai pas non plus testé que mon code fonctionne réellement. :)

settings.py

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

DATABASE_ROUTERS = ['path.to.ModelMetaRouter']

Modèles

Ajoutez ensuite des variables Meta personnalisées à vos géo-tables, pour remplacer leur base de données. N'ajoutez pas cet attribut aux modèles censés aller dans la base de données par défaut.

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

Routeur de base de données

Et écrivez un routeur de base de données pour diriger tous les modèles qui ont le using ensemble d'attributs meta, à la connexion appropriée :

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