MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Misturando PostgreSQL e MongoDB (como backends do Django)


Desde o Django 1.2, você pode definir várias conexões de banco de dados em seu settings.py . Então você pode usar roteadores de banco de dados para dizer ao Django para qual banco de dados ir, de forma transparente para sua aplicação.

Isenção de responsabilidade: é assim que eu penso deve funcionar, eu nunca usei o MongoDB no Django, nem testei se meu código realmente funciona. :)

configurações.py

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

DATABASE_ROUTERS = ['path.to.ModelMetaRouter']

Modelos


Em seguida, adicione variáveis ​​Meta personalizadas às suas tabelas geográficas, para substituir seu banco de dados. Não adicione este atributo a modelos que devem ir para o banco de dados padrão.
class SomeGeoModel(models.Model):
    ...
    class Meta:
        using = 'geodata'

Roteador de banco de dados


E escreva um roteador de banco de dados para direcionar todos os modelos que tenham o using meta atributo definido, para a conexão apropriada:
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