2009-09-18 70 views
0

更新時間:WERKZEUG和SQLAlchemy的0.5倍會話

通過WERKZEUG link text教學走向,得到了疊加使用sessionmaker()創建的SQLAlchemy會話,而不是建議建立事務()。

注意:這不是關於SA,而是關於Werkzeug。

WERKZEUG教程:

session = scoped_session(lambda: create_session(bind=application.database_engine, 
    autoflush=True, autocommit=False), local_manager.get_ident) 

我問到如何實現使用sessionmaker相同():

由於從#pocoo RCI結果人幫我這個:

session = scoped_session(lambda: sessionmaker(bind=application.database_engine)(), 
    local_manager.get_ident) 

沒有()在sessionmaker結束時(**參數)它不斷給我一個錯誤:

RuntimeError:沒有綁定到應用程序的對象

P.S.如果刪除lambda它將無法正常工作。

回答

4

sessionmaker()返回會話工廠,而不是會話本身。 scoped_session()以會話工廠爲參數。所以只需省略lambda:並將sessionmaker()的結果直接傳遞給scoped_session()即可。

+1

沒有提到它,我正在和Werkzeug lib和SA玩。我試圖採用SA sessionmaker()而不是session_create(),因爲SA Tutorial建議這樣做。 來自#pocoo IRC的夥計幫助我,但我仍然沒有得到它的訣竅。他們在sessionmaker()的末尾添加了「()」,現在它可以工作。 – VVP 2009-09-18 16:05:24

+1

你正在爲自己,你的代碼的讀者和你的python解釋器做更多的工作,其中包括:這樣寫而不是聽螞蟻Aasma。你也打破了你的'scoped_session'。你的代碼創建一個'sessionmaker',然後調用它(返回一個會話),並將這個會話在一個lambda中傳遞給'scoped_session'。所以每次'scoped_session'試圖返回一個新的會話,它實際上返回相同的會話。省略'lambda',並從sessionmaker調用結束時刪除()。 'scoped_session(sessionmaker(*參數))' – jcdyer 2009-09-18 18:34:14