2009-07-07 62 views
1

我正在做一个应用程序,它将使用多个sqlite3数据库,并预先使用来自外部应用程序的数据。每个数据库将具有完全相同的表格,但具有不同的数据。在运行时切换TG2中的数据库

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

+0

几乎任何其他设计都比这更好。为什么不能从多个来源加载单个数据库? – 2009-07-07 18:05:12

回答

1

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

1

Dzhelil,

我写了一篇博客文章而回有关使用TG2多个数据库。您可以将此方法与Jorge提出的多个DBSessions结合使用,我认为您可以轻松做到这一点。

How to use multiple databases in TurboGears 2.0

希望这有助于 赛斯

1

我使用两个数据库的只读应用。第二个数据库是主数据库关闭时的缓存。我使用两个对象来保存连接,元数据和兼容Table实例。查看功能的顶部分配db = primarydb = secondary,其余仅针对db.tableA.join(db.tableB)查询。我没有使用ORM。

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

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