【问题标题】:Changing database per view & accessing multiple databases per view每个视图更改数据库 & 每个视图访问多个数据库
【发布时间】:2011-10-26 09:46:01
【问题描述】:

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

几乎就好像会话没有绑定到数据库并且它选择了当时恰好在会话中的那个?这可能没有意义——我对 SQLAlchemy 的理解不是很好。

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

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

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

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

【问题讨论】:

    标签: python sqlalchemy pylons pyramid


    【解决方案1】:

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

    例子:

    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"))
    

    【讨论】:

      【解决方案2】:

      您可以直接将引擎设置为 sqlalchemy 会话

      列出所有 4 个数据库中的所有“订单”的示例:

      def site_orders(request):
          ...
          orders = []
          for engine in engines:
              dbsession.bind = engine
              orders += dbsession.query(Order).order_by(Order.cdate.desc())[:100]
      
          return dict(orders=orders, pagetitle=(site+" Orders"))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-09
        • 2017-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-18
        相关资源
        最近更新 更多