在运行时期间在TG2中切换数据库

时间:2009-07-07 17:14:53

标签: python sqlite turbogears turbogears2

我正在做一个应用程序,它将使用多个sqlite3数据库,预先设置来自外部应用程序的数据。每个数据库都将具有完全相同的表,但具有不同的数据。

我希望能够根据用户输入在这些数据库之间切换。 TurboGears 2中最优雅的方法是什么?

3 个答案:

答案 0 :(得分:1)

如果所有数据库都具有相同的架构,那么您应该能够使用相同的模型为不同的数据库创建多个会话。

答案 1 :(得分:1)

Dzhelil,

我在一段时间后写了一篇关于在TG2中使用多个数据库的博客文章。你可以将这种方法与Jorge对多个DBSessions的建议结合起来,我认为你可以轻松地做到这一点。

How to use multiple databases in TurboGears 2.0

希望这有帮助, 塞特

答案 2 :(得分:1)

我使用两个数据库作为只读应用程序。第二个数据库是主数据库关闭时的缓存。我使用两个对象来保存连接,元数据和兼容的Table实例。视图函数的顶部指定db = primarydb = secondary,其余的只是针对db.tableA.join(db.tableB)的查询。我没有使用ORM。

架构并不完全相同。主数据库需要schema.前缀(Table(...schema='schema'))而缓存数据库不需要。为了解决这个问题,我在一个函数中创建了我的表对象,该函数将模式名称作为参数。通过为每个数据库调用一次函数,我最终得到了兼容的前缀和非前缀Table对象。

至少在Pylons中,SQLAlchemy meta.SessionScopedSession。每个请求后,BaseController中的应用程序appname/lib/base.py会调用Session.remove()。让一个Session与两个数据库进行对话可能会更好,但如果不这样做,则可能需要修改BaseController以在每个.remove()上调用Session