Recherche…


Ajout d'un fichier de routage de base de données

Pour utiliser plusieurs bases de données dans Django, il suffit de spécifier chacune d’elles dans settings.py :

DATABASES = {
    'default': {
        'NAME': 'app_data',
        'ENGINE': 'django.db.backends.postgresql',
        'USER': 'django_db_user',
        'PASSWORD': os.environ['LOCAL_DB_PASSWORD']
    },
    'users': {
        'NAME': 'remote_data',
        'ENGINE': 'django.db.backends.mysql',
        'HOST': 'remote.host.db',
        'USER': 'remote_user',
        'PASSWORD': os.environ['REMOTE_DB_PASSWORD']
    }
}

Utilisez un fichier dbrouters.py pour indiquer quels modèles doivent fonctionner sur quelles bases de données pour chaque classe d'opération de base de données. Par exemple, pour les données distantes stockées dans remote_data , vous pouvez vouloir:

class DbRouter(object):
    """
    A router to control all database operations on models in the
    auth application.
    """
    def db_for_read(self, model, **hints):
        """
        Attempts to read remote models go to remote database.
        """
        if model._meta.app_label == 'remote':
            return 'remote_data'
        return 'app_data'

    def db_for_write(self, model, **hints):
        """
        Attempts to write remote models go to the remote database.
        """
        if model._meta.app_label == 'remote':
            return 'remote_data'
        return 'app_data'

    def allow_relation(self, obj1, obj2, **hints):
        """
        Do not allow relations involving the remote database
        """
        if obj1._meta.app_label == 'remote' or \
           obj2._meta.app_label == 'remote':
           return False
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """
        Do not allow migrations on the remote database
        """
        if model._meta.app_label == 'remote':
            return False
        return True

Enfin, ajoutez votre dbrouter.py à settings.py :

DATABASE_ROUTERS = ['path.to.DbRouter', ]

Spécifier différentes bases de données dans le code

La obj.save() normale obj.save() utilisera la base de données par défaut ou, si un routeur de base de données est utilisé, elle utilisera la base de données spécifiée dans db_for_write . Vous pouvez le remplacer en utilisant:

obj.save(using='other_db')
obj.delete(using='other_db')

De même, pour lire:

MyModel.objects.using('other_db').all()


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow