2009-07-07 13 views
1

Je suis en train de faire une application qui utilisera plusieurs bases de données sqlite3, prépoliées avec des données provenant d'une application externe. Chaque base de données aura exactement les mêmes tables, mais avec des données différentes.Changement de bases de données dans TG2 pendant l'exécution

Je souhaite pouvoir basculer entre ces bases de données en fonction de la saisie par l'utilisateur. Quelle est la manière la plus élégante de le faire dans TurboGears 2?

+0

Presque tout autre design est meilleur que cela. Pourquoi ne pouvez-vous pas charger une seule base de données à partir de plusieurs sources? –

+0

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

+0

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

Répondre

1

Si TOUTES les bases de données ont le même schéma, vous devriez être capable de créer plusieurs sessions en utilisant le même modèle pour les différents DB.

1

Dzhelil,

J'ai écrit un billet de blog un certain temps sur l'utilisation de plusieurs bases de données TG2. Vous pouvez combiner cette méthode avec la suggestion de Jorge de DBSessions multiples et je pense que vous pourriez le faire facilement.

How to use multiple databases in TurboGears 2.0

Hope this helps, Seth

1

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.