2011-03-19 4 views
2

J'ai une application django avec plusieurs bases de données. La base de données par défaut est sur la machine locale. Il y a aussi une base de données mysql distante qui est utilisée pour certaines opérations d'écriture, mais ce n'est pas toujours le cas. Lorsque le serveur est arrêté, mysqldb déclenche une erreur OperationalError.Django bases de données multiples - ne peut pas se connecter au serveur mysql fallback à sqlite

Je voudrais avoir une base de données sqlite locale appelée 'fallback' qui accepterait les données si le serveur mysql est hors service. Je me rends compte que cela implique à try/except clause dans django.db.mysql.base, mais je ne suis pas sûr de savoir où aller à partir de là. Quelqu'un at-il essayé quelque chose de similaire? Avez-vous des suggestions sur une meilleure façon de gérer cela?

Répondre

1

Vous pouvez probablement utiliser Database Routers en combinaison avec une classe de modèle de base personnalisée qui remplace la méthode save. Enveloppez-le dans un try..catch, et si l'erreur OperationalError se produit, fournissez quelques indications pour que votre routeur de base de données puisse déterminer si le remplacement doit être utilisé.

Je pense que ce sera le moyen le plus propre, plutôt que de modifier le code django lui-même.

+0

+1 pour me convaincre de ne pas modifier le code django. Je n'ai pas utilisé les routeurs en raison de la nature spécifique des écritures à la base de données distante. Voir ma solution à http://stackoverflow.com/questions/4945295/django-multiple-databases-one-not-always-available/. Cela n'avait pas fonctionné, en raison d'une erreur connexe dans un gestionnaire de signal connection_created. – AgDude

+0

Les routeurs ne traitent pas les connexions de base de données et les curseurs (qui sont responsables de OperationalError). Ils sélectionnent simplement un alias de base de données, c'est-à-dire la clé de votre dictionnaire settings.DATABASES. Avez-vous trouvé une méthode alternative pour tester une connexion à une base de données et en sélectionner une autre en tant que solution de secours? – Oberix

+0

Vous avez raison @Marco. Je recommande maintenant de faire un essai: .using ['primary'] sauf: .using ['backup'] dans la méthode save. –

Questions connexes