2013-06-22 27 views
1

我目前正在開發一個新的Web應用程序,它需要在嚮應用程序本身提供會話之前執行SQL語句。SQLAlchemy連接如何與基於會話的事務相關聯?

詳細信息:我正在運行帶有多個模式的PostgreSQL數據庫服務器,並且我需要在應用程序使用會話之前執行SET search_path語句。我也使用ZopeTransactionExtension讓請求級別自動處理事務。

爲了確保SQL語句的exectuion,似乎有兩種可能的方式:

由於我使用的作用域會話並希望保持我的事務完好無損,我不知道哪種方法可能會干擾事務管理。

例如,引擎是否從池中發出新連接每個查詢?或者連接到會話的整個生命週期,即直到請求被處理並且會話&事務被關閉/提交?

另一方面,由於我正在使用範圍會話,我可以按照zzzeek在第二個鏈接中提示的方式執行它嗎?也就是說,一旦交易結束,上下文是否保留並自動重置?

有可能是我失蹤的第三種方式?

回答

4

例如,引擎是否在每個查詢中從池中分發新連接?

僅當您有autocommit = True時,情況不應該如此。

或者它是否附加到會話的一生中,即直到請求已處理並且會話&事務被關閉/提交?

它被附加到每筆交易。但Postgresql中的「search_path」是每個postgresql會話(不要與SQLAlchemy會話混淆) - 它基本上是連接本身的生命週期。

這段時間的會話(以及引擎和池)有大量的事件鉤子可以抓取,以便像這樣設置狀態。如果你想堅持會議,你可以嘗試after_begin

+0

太棒了,謝謝。然後,我將鉤入會議。什麼是相反的事件? 'after_commit'?因爲我想在會話結束後重置search_path。 – javex

相關問題