作爲SQLAlchemy的新手,我想知道在什麼時候應該調用Session()
,比如說,一個視圖。它應該被定義爲一個全局變量,還是應該爲每個請求創建一個新的會話。SqlAlchemy - 什麼時候應該創建新會話?
回答
我強烈建議您按照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
。
此外,本教程還擴展了所有這些和更多。
實際上,在閱讀了更多的sqlalchemy文檔之後,我發現了正確的答案,我的問題是應該爲每個請求創建一個新的上下文會話。請參閱http://docs.sqlalchemy.org/en/rel_0_7/orm/session.html#lifespan-of-a-contextual-session
那麼這和我的答案有什麼不同呢? –
在您的回答中,您的代碼指出應該直接使用DBSession,在文檔中指出應爲每個請求創建上下文會話。所以: @view_config()def get_view(request): session = DBSession()並因此爲每個請求創建一個新的會話。 – Wiz
閱讀我鏈接到的教程,請參閱https://github.com/Pylons/pyramid/blob/master/docs/tutorials/wiki2/src/basiclayout/tutorial/views.py –
- 1. struts2創建會話對象,爲什麼和什麼時候?
- 2. 什麼時候應該在Javascript中創建一個新對象?
- 3. 我們什麼時候應該在wit.ai創建新的意圖
- 4. 什麼時候應該創建一個新的分支?
- 5. 什麼時候應該創建一個新的異常類
- 6. 什麼時候應該創建新的活動?
- 7. 什麼時候應該創建新隊列?
- 8. 什麼時候創建自己的DLL應該在什麼
- 9. 什麼時候應該更新UI?
- 10. 什麼時候應該刷新osgi?
- 11. 什麼時候應該在php中使用會話變量?
- 12. 什麼時候應該使用會話變量而不是cookie?
- 13. 什麼時候使用快速會話創建一個cookie?
- 14. 什麼時候應該在SQLAlchemy上調用flush()?
- 15. 什麼時候應該使用for循環提交SQLAlchemy?
- 16. 如何處理會話?我們什麼時候創建會話ID
- 17. 我應該在什麼時候創建一個cookie?
- 18. 什麼時候應該在OOP中創建對象?
- 19. 節點應該在什麼時候創建數據庫連接?
- 20. 什麼時候應該發佈由[NSMutableDictionary dictionary]創建的字典?
- 21. 什麼時候應該創建mysql觸發器?
- 22. 什麼時候應該在Rails中創建命名路線?
- 23. 什麼時候我們不應該創建一個jquery插件?
- 24. 什麼時候應該在MVC中創建模型?
- 25. 什麼時候應該創建一個靜態類?
- 26. 什麼時候應該創建數據庫索引?
- 27. 什麼時候應該擴展NSDocument,什麼時候應該擴展NSWindowController?
- 28. 什麼時候應該使用sed,什麼時候應該使用awk
- 29. 什麼時候應該使用memcpy,什麼時候應該使用memmove?
- 30. 什麼時候應該使用Import-Package,什麼時候應該使用Require-Bundle?
我只是想添加一個小提示,它只適用於'pyramid_tm'激活或另一個知道'transaction'包的事務管理器。 :-) –
@MichaelMerickel:確實;本教程確保它被激活。本教程比單純的答案更全面。 :-) –