MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come scrivere un'applicazione Python che supporta più database

Django supporta più database quindi tutto ciò di cui hai bisogno è del codice per gestire il passaggio da uno all'altro.

Se hai letto i documenti, vedrai che Django ti consente di fornire la tua classe 'router' personalizzata che decide quale database utilizzare per una determinata query:
https://docs.djangoproject.com/en/1.6/topics/db/multi-db/# utilizzando-router

Dal momento che dici di voler selezionare quale db "sul front end", presumibilmente ogni utente del tuo sito potrebbe scegliere un backend di database diverso. Questo presenta un problema perché il router db non sa nulla della richiesta http e dell'utente correnti.

Ti suggerisco di utilizzare questo middleware "ThreadLocal" per archiviare l'oggetto della richiesta corrente in modo da potervi accedere dal router personalizzato:
https://github.com/jedie/django-tools/blob/master/django_tools/middlewares/ThreadLocal.py

Supponiamo di salvare il backend scelto dall'utente nella sessione come request.session['db_name'] - il tuo router sarebbe simile a questo:

from django_tools.middlewares import ThreadLocal

class RequestRouter(object):
    def db_for_read(self, model, **hints):
        request = ThreadLocal.get_current_request()
        return request.session.get('db_name', 'default')

    def db_for_write(self, model, **hints):
        request = ThreadLocal.get_current_request()
        return request.session.get('db_name', 'default')

    def allow_relation(self, obj1, obj2, **hints):
        return True

    def allow_syncdb(self, db, model):
        return True