2016-11-21 10 views
1

私はピラミッドWebページのセットアップを持っています。 sql_list内のデータに基づいて自分のWebページを表示する扱い、その後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) 

(マコが、私はそれは無関係だと思う)テンプレート - :ビューの一つは、このような何かを行います。

handle_a_post_request機能では、ポストリクエストに基づいてセッションを変更し(コミット()を実行します)これらの変更は結果のページに表示されます。これは、クエリ自体がテンプレート内で呼び出されたときに実際に実行されるか実行されることを示唆しています。私はmakoを使用しているので、 -

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

私の結論は正しいですか?正確にsqlalchemyクエリが '実現済み'の場合、その時点以降のセッションの変更がクエリの '結果'に表示されなくなりますか?または、私の理解は根本的にどこかに欠陥がありますか?

私の関心事は、今後、do_a_query()機能の変更(たとえば、表示する前にいくつかの前処理についてその結果を反復する)が私のWebページの動作を変更することです。もちろん、「正しい」答えはちょうど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'インスタンスを反復処理し始めるものはすべてクエリを実行しますか? 2回繰り返すと(そして両方の反復の間に何かが起こる)どうすればよいでしょうか? –

+0

@ NgOon-Ee次に、2つのクエリを実行します。セッションで何かを変更する(インスタンスを追加する、インスタンスを削除する、インスタンスを更新する)場合、SQLAlchemyはデフォルトで2番目のクエリを実行する前に必要な変更を行います。 *別のトランザクション*が何かを変更すると、分離レベルによっては変更が表示される場合と表示されない場合があります。 – univerio

+0

ありがとうございます。ですから私の間違いは、 'Query'インスタンスが実際には一連の結果であると想像しています。迅速かつ正確な説明をいただきありがとうございます。 –