2016-11-21 61 views
1

我有一個金字塔網頁設置。其中一個觀點確實是這樣的: -SQLAlchemy查詢 - 它們何時執行?

sql_list = do_a_query() 
handle_a_post_request(request) 
return dict(sql_list=sql_list) 

def do_a_query(): 
    request.db.query(WhatIAmLookingFor) 

的(灰鯖鯊,但我認爲這是不相關的),那麼模板處理基於在sql_list數據顯示我的網頁。

handle_a_post_request函數中,我根據發佈請求修改會話(並運行commit())。這些修改顯示在結果頁面中,這表明查詢本身實際上「運行」或在我的模板中調用時執行。由於我使用的是mako,所以調用是使用: -

% for row in sql_list: 
<tr> 
    <td> ${row[0]} </td> 
    <td> ${row[1]} </td> 
    <td> ${row[2]} </td> 
</tr> 

我的結論是否正確?當確實是sqlalchemy查詢「已實現」時,會在該點之後的會話更改不再顯示在查詢的「結果」中?或者我的理解在某個地方存在根本上的缺陷?

我擔心的是,將來對函數的改變(例如,在顯示之前迭代其某些預處理的結果)將會改變我的網頁的行爲。當然,「正確的」答案只是提前移動handle_a_post_request(),但我想先徹底理解發生的事情。

+0

我想你可能會遇到''autoflush'',看看這個:http://stackoverflow.com/questions/4201455/sqlalchemy-whats-the-difference-between-flush-and-commit –

+0

沒有,肯定沒有那個集合。 –

回答

1

查詢通常在遍歷Query實例時執行。 Query.all()是從Query迭代器構建列表的簡便方法。 (當您嘗試加載過期屬性時,查詢也會自動執行,但出於此答案的目的,我們將忽略這些屬性。)

請務必注意,在任何時候都無法更改會話。默認情況下,SQLAlchemy確保會話在適當的時候刷新,以便會話的更改反映在下一個查詢上。

對你而言,你應該返回.all()的結果do_a_query()而不是返回查詢本身。

+0

謝謝,所以任何開始遍歷'Query'實例的東西都會執行查詢?如果我遍歷它兩次(以及兩次迭代之間發生的事情),該怎麼辦? –

+0

@ NgOon-Ee然後它會執行兩個查詢。如果在會話中更改某些內容(添加實例,刪除實例,更新實例),則默認情況下,SQLAlchemy將在執行第二個查詢之前進行必要的更改。如果*另一個事務*改變了某些東西,那麼取決於隔離級別,您可能會看到或可能看不到更改。 – univerio

+0

謝謝。所以我的錯誤在於想象'Query'實例實際上是一組結果。感謝您快速,準確的解釋。 –