J'ai essayé d'installer Django 1.4.3 pour utiliser plusieurs DB, mais pour la vie de moi, je ne peux pas le faire fonctionner. J'ai lu la documentation et les messages sur le SO, et fait ce qui suit:Comment utiliser le routeur DB dans Django 1.4
1) Ajouter une seconde configuration de DB dans settings.py
, comme suit:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': '/tmp/django.db',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
},
'db1' : {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db1',
'USER': 'fake',
'PASSWORD': 'fake',
'HOST': 'fake.host.com',
'PORT': '3306',
},
}
2) Créer une routers.py
et définir une routeur DB comme suit
(note: Selon SO messages, si vous définissez un routeur DB dans models.py
, le routeur ne fonctionnera pas)
class DBRouter(object):
def db_for_read(self, model, **hints):
return 'db1'
def db_for_write(self, model, **hints):
return 'db1'
def allow_syncdb(self, db, model):
return 'db1'
3) Ajoutez les lignes suivantes à settings.py
(Note: Selon SO messages, ces lignes doivent être après la DATABASES
configurations
from django.db import connections
DATABASE_ROUTERS = ['fakeproject.routers.DBRouter',]
C'était faux. Ne pas mettre from django.db import connections
ici car il empêche le routeur être enregistré
Mes symptômes:
Apparemment, tous mes appels sont acheminés par la valeur par défaut DB. Détails ci-dessous:
Les deux fonctionnent de paramètres DB (je peux effectuer
manage.py indpectdb --database db1
avec succès cadreDATABASE_ROUTERS
ne génère aucun reproche (même si je mets un mauvais chemin au routeur DB, ou même un non objet chaîne)lorsque je tente d'accéder à mes objets via
manage.py shell
, je peux faireMyModel.objects.all()
mais lorsque je tente en fait itérer, je me ditno such table
. La valeur par défaut DB ne pas cette table, mais « DB1 » a clairement comme je l'ai généré le modèle en utilisantinspectdb
à ce sujet. Pour preuve, si je permute la configuration DB entredb1
etdefault
, je peux accéder à l'objet sans problème.
Toute aide hautement appréciée!
Merci pour la réponse! Pourquoi aurait une sous-classe entre résoudre le problème si? –
Vous avez besoin de deux classes dans 'DATABASE_ROUTERS' - une pour chaque DB. Je sous-classe comme je préfère le code DRY (vous pourriez réécrire en deux classes, mais le code serait presque identique). – danodonovan