2012-07-04 60 views

回答

8

我強烈建議您按照Pyramid SQLAlchemy tutorial。它教你如何在一個簡單的Wiki應用程序中使用Pyramid的SQLAlchemy。

你會注意到,教程a models.py模塊被創建,它定義了一個DBSession項目。這使您可以訪問SQLAlchemy的會議,作用域爲一個金字塔線綁在金字塔交易模式,而當你需要的會話這是進口:

from pyramid.view import view_config 

from .models import (
    DBSession, 
    MyModel, 
    ) 

@view_config(route_name='home', renderer='templates/mytemplate.pt') 
def my_view(request): 
    one = DBSession.query(MyModel).filter(MyModel.name=='one').first() 
    return {'one':one, 'project':'tutorial'} 

models.py的DBSession變量定義如下:

from sqlalchemy.orm import (
    scoped_session, 
    sessionmaker, 
    ) 

from zope.sqlalchemy import ZopeTransactionExtension 

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

請注意ZopeTransactionExtension; Pyramid會自動爲每個請求啓動一個新的事務,在成功的響應中提交它,並在異常發生時中止它。這減輕了大部分交易處理責任。當您需要查看數據庫的更新時(例如自動遞增主鍵),請記住您的會話爲.flush

此外,本教程還擴展了所有這些和更多。

+0

我只是想添加一個小提示,它只適用於'pyramid_tm'激活或另一個知道'transaction'包的事務管理器。 :-) –

+0

@MichaelMerickel:確實;本教程確保它被激活。本教程比單純的答案更全面。 :-) –

1

實際上,在閱讀了更多的sqlalchemy文檔之後,我發現了正確的答案,我的問題是應該爲每個請求創建一個新的上下文會話。請參閱http://docs.sqlalchemy.org/en/rel_0_7/orm/session.html#lifespan-of-a-contextual-session

+0

那麼這和我的答案有什麼不同呢? –

+0

在您的回答中,您的代碼指出應該直接使用DBSession,在文檔中指出應爲每個請求創建上下文會話。所以: @view_config()def get_view(request): session = DBSession()並因此爲每個請求創建一個新的會話。 – Wiz

+0

閱讀我鏈接到的教程,請參閱https://github.com/Pylons/pyramid/blob/master/docs/tutorials/wiki2/src/basiclayout/tutorial/views.py –

相關問題