Buscar..


Agregar un archivo de enrutamiento de base de datos

Para usar múltiples bases de datos en Django, solo especifique cada una en 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']
    }
}

Utilice un archivo dbrouters.py para especificar qué modelos deben operar en qué bases de datos para cada clase de operación de base de datos, por ejemplo, para datos remotos almacenados en remote_data , es posible que desee lo siguiente:

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

Finalmente, agregue su dbrouter.py a settings.py :

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

Especificando diferentes bases de datos en el código.

El obj.save() normal obj.save() usará la base de datos predeterminada, o si se usa un enrutador de base de datos, usará la base de datos como se especifica en db_for_write . Puedes anularlo usando:

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

Del mismo modo, para la lectura:

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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow