程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

更改每个视图的数据库并访问每个视图的多个数据库

发布于2019-11-19 21:45     阅读(974)     评论(0)     点赞(0)     收藏(3)


我在金字塔中使用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。刷新通常会切换每次选择的数据库。其他网址也一样。

它几乎好像该会话未绑定到数据库,并且选择该会话中当时发生的任何事件?那可能没有道理-我对SQLAlchemy的理解不是很好。

真的希望有人能提供帮助,因为这完全取决于在视图中快速轻松地切换数据库的能力,目前似乎完全无法控制它。

注意:我最初确实尝试遵循并更改使用的Pyramid SQLA + URL Dispatcher教程:

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

但是我在找到sqlahelper时将其删除。如果我应该使用它,请告诉我。


解决方案


对每个请求进行配置和连接对我来说似乎是很多工作。我将在模型模块中创建四个会话处理程序,然后从中选择。

例:

models/__init__.py

DBSession1 = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))  
DBSession2 = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))  
DBSession3 = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))  
DBSession4 = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))  
metadata1 = MetaData()                                                           
metadata2 = MetaData()                                                           
metadata3 = MetaData()                                                           
metadata4 = MetaData()                                                           

def initialize_sql(engines, drop_db=False):                                      
    DBSession1.configure(bind=engine[0])
    DBSession2.configure(bind=engine[1])                                            
    DBSession3.configure(bind=engine[2])                                            
    DBSession4.configure(bind=engine[3])                                            
    metadata1.bind = engine[0]                                            
    metadata2.bind = engine[1]                                            
    metadata3.bind = engine[2]                                            
    metadata4.bind = engine[3]  

然后您认为:

from mypackage.models import DBSession1, DBSession2, DBSession3, DBSession4

def site_orders(request)                                                      
    site = request.matchdict['site']                                                      
    dbsession = globals().get("DBSession%d" % site)                                                      
    orders = dbsession.query(Order).order_by(Order.cdate.desc())[:100]                                                      
    return dict(orders=orders, pagetitle=(site+" Orders"))


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/161799/2a80a72385b9a46f57b6/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

0 0
收藏该文
已收藏

评论内容:(最多支持255个字符)