J'utilise deux bases de données pour une application de lecture seule. La deuxième base de données est un cache au cas où la base de données primaire est en panne. J'utilise deux objets pour contenir la connexion, les métadonnées et les instances compatibles Table
. Le haut de la fonction d'affichage attribue db = primary
ou db = secondary
et le reste est juste des requêtes contre db.tableA.join(db.tableB)
. Je n'utilise pas l'ORM.
Les schémas ne sont pas strictement identiques. La base de données primaire a besoin d'un préfixe schema.
(Table(...schema='schema')
) et non de la base de données de cache. Pour contourner ce problème, je crée mes objets table dans une fonction qui prend le nom du schéma en argument. En appelant la fonction une fois pour chaque base de données, je me retrouve avec des objets compatibles Table
préfixés et non préfixés.
Au moins dans Pylons, le SQLAlchemy meta.Session
est un ScopedSession
. L'application BaseController
dans appname/lib/base.py
appelle Session.remove()
après chaque demande. Il est probablement préférable d'avoir un seul Session
qui parle aux deux bases de données, mais si vous ne le faites pas, vous devrez peut-être modifier votre BaseController
pour appeler .remove()
sur chaque Session
.
Presque tout autre design est meilleur que cela. Pourquoi ne pouvez-vous pas charger une seule base de données à partir de plusieurs sources? –
Ou attachez les bases de données externes à votre base de données actuelle. Ce qui les amène à se comporter comme s'ils étaient dans la même connexion, juste dans un espace de noms différent. – Christopher
Pour charger tout dans une base de données, je devrais modifier le schéma, et je ne peux pas le faire car les autres applications dépendent de ce schéma. La suggestion ATTACH semble intéressante, mais je ne peux pas penser à un moyen de le faire fonctionner dans mon cas. Je compte sur sqlalchemy pour construire mon modèle de façon déclarative, et chaque classe de modèle est associée à un nom de table. Pour attacher des bases de données identiques, je devrai ajouter un identifiant à chaque table, ce qui va casser sqlalchemy. – dzhelil