我在 Pyramid 中使用 SQLAlchemy 时遇到一些问题。虽然我可以找到我需要的示例,但它们通常都很短且缺乏。所以我最终得到了几乎没有任何意义的零碎代码。所以我希望有人能够给出我需要做什么的更完整的例子。
我有 4 个数据库,全部具有相同的架构。我希望能够从一个 Pyramid 应用程序中处理它们,有时列出所有 4 个数据库中的所有“订单”,有时只列出“site1”中的所有“订单”。由于架构相同,我也对数据库使用相同的模型类。
我已经尝试过使用 sqlahelper 和普通的 SQLAlchemy,但没有成功。下面的代码使用 sqlahelper 但我很乐意使用任何有效的东西:
__init__.py
site1_eng = engine_from_config(settings, prefix='site1.')
site2_eng = engine_from_config(settings, prefix='site2.')
site3_eng = engine_from_config(settings, prefix='site3.')
sqlahelper.add_engine(site1_eng, 'site1_eng')
sqlahelper.add_engine(site2_eng, 'site2_eng')
views.py
def site_orders(request):
site = request.matchdict['site']
db_eng = sqlahelper.get_engine(("%s_eng" % (site)))
conn = db_eng.connect()
dbsession = sqlahelper.get_session()
dbsession.configure(bind=conn)
orders = dbsession.query(Order).order_by(Order.cdate.desc())[:100]
return dict(orders=orders, pagetitle=(site+" Orders"))
会发生什么?
好吧,我希望它能根据 URL 切换数据库,而且确实如此!然而,选择哪一个似乎完全是随机的。因此 /orders/site1/ 有时会转到 site2 数据库,有时会转到 site3。刷新常常会切换每次选择的数据库。其他 URL 也一样。
就好像会话没有绑定到数据库,并且它选择当时恰好在会话中的那个?这可能没有意义 - 我对 SQLAlchemy 的理解不是很好。
真的希望有人能够提供帮助,因为这一切都取决于在视图中快速轻松地切换数据库的能力,而目前似乎完全不可能控制它。
笔记:
我最初尝试遵循并更改 Pyramid SQLA+URL Dispatcher 教程,该教程使用了:
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
但我在找到sqlahelper时删除了它。如果我应该使用它,请告诉我。