Django Routage Bdd

Published 01-22-2016 15:35:54

Solution pour utiliser 2 bases de données avec plusieurs modèles. Dans le fichier settings.py, définir les 2 bdds:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',
        'USER': 'mega_user',
        'PASSWORD': 'mega_mot_de_passe',
        'HOST': '192.168.55.4',
        'PORT': '3306',
    },
    'treco_facturation': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_trecobat',
        'USER': 'mega_user2',
        'PASSWORD': 'mega-Mot_de_passe2',
        'HOST': '192.168.55.5',
        'PORT': '3306',
    }
}

Sur chaque modèle, déclarer la BDD à utiliser :

_DATABASE = "default" ou _DATABASE = "treco_facturation"

Dans l’application créer un fichier (ex:db_router.py) qui va contenir le détail du routage des bases de données:

class TrecoRouter(object):

def db_for_read(self, model, **hints):
    database = getattr(model, "_DATABASE", None)
    if database:
        return database
    else:
        return "default"

def db_for_write(self, model, **hints):
    database = getattr(model, "_DATABASE", None)
    if database:
        return database
    else:
        return "default"

def allow_relation(self, obj1, obj2, **hints):
    db_list = ('default')
    if obj1._state.db in db_list and obj2._state.db in db_list:
        return True
    return None

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

Enfin, dans le settings.py, après la définition des bases de données, on rajoute la ligne indiquant qu’il y a un routage et ou le trouver (ex: numeros.db_router.TrecoRouter)

DATABASE_ROUTERS = ['NOM_APP.NOM_FICHIER.NOM_CLASSE']

Et voilà.

Source stackoverflow, plus d’infos sur le routage chez django