Flask - BUG - flask-sqlalchemy - sqlalchemy.orm.exc.DetachedInstanceError

目錄

錯誤展示

代碼展示

產生原因

解決方式


錯誤展示

flask - sqlalchemy - 官方解釋文檔

代碼展示

 

產生原因

每次僅使用一個session,commit會將session內所有對象進行提交併刪除,則後續session內無對象,需要手動add。

每次調用db.session它都會將調用傳遞給綁定到當前作用域(由其定義scopefunc)的會話。默認情況下,Flask-SQLAlchemy定義scopefunc返回當前線程的標識。

正常生產:

  1. 每個線程中一次只處理一個請求;
  2. 會話db.session在第一次調用時打開;
  3. Flask-SQLAlchemy在請求後關閉會話(完全在應用程序拆解時)。

假設該應用程序在每個請求期間使用單獨的會話。會話在開始時打開,在請求結束時關閉。

在當前測試的實現中:

  1. 每個請求都在同一個線程中處理,因此使用相同的SQLAlchemy會話;
  2. 第一次打開的會話被db.session調用,並且在測試加載燈具時發生;
  3. Flask-SQLAlchemy在應用程序拆解時關閉會話。它只發生在tearDown方法中 - 當最後一個上下文離開應用程序上下文的堆棧時。

因此,情況非常不同:使用相同的SQLAlchemy會話來處理測試期間發出的所有請求。這與生產中的工作方式有很大的不同,消除它會很好。

Flask-WebTest提供了輕鬆管理SQLAlchemy範圍的方法: SQLAlchemyScope您可以進入和退出以及scopefunc 在測試期間必須使用的自定義。

解決方式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章