2017-12-05 9 views
0

セッションオブジェクトを作成するときに、定期的にflush()を実行するように設定できますか?SQLAlchemy session.flush()を定期的に設定する方法

私はこの機能が必要なのは、セッションのスコープの下で、メモリ内に短いバックグラウンドジョブが実行されているためです。 DBからの進捗状況をクライアントが定期的に問い合わせることができるように、プログラムがflush()を使用してDBのジョブの進行状況を定期的に更新するようにします。

現在、私の解決策は、session.flush()を定期的に実行する別のスレッドを使用しています。

ありがとうございます!

+1

変更を他のクライアントに見せるには、 'commit()'を呼び出す必要があります。 'flush()'も働くという事実は、あなたが使っている分離レベルの副作用です。あなたの目標を達成するために、あなたの仕事の進捗状況を報告したいときはいつも、あなたのモデルを更新してコミットしてください。別のスレッドは必要ありません。 – univerio

+0

'commit()'を起動していただきありがとうございます。いくつかの実験の後、セッションのトランザクションレベルがREPEATABLE READであることがわかりましたが、クライアントは未コミットの更新を読み取ることができました。なぜこれが起こるか知っていますか? – 8090PZ

+0

あなたは 'autoflush'をオンにしていて、autoflushを起動しているか、' autocommit'をオンにしています。 – univerio

答えて

0

コード内でsession.flush()を何度も呼び出す必要はありません。既定ではSqlAlchmey autoflushがTrueに設定されています。つまり、更新、削除、挿入操作はコミットのためのtranseactionにすでに追加されています。ですから、DBへのクエリは常に最新のデータを取得します。これは、選択されたクエリが起動されても、無関係な変更を最初にコミットする必要がある作業パターンの単位です。

In [8]: session.autoflush 
Out[8]: True 

In [9]: session.autocommit 
Out[9]: False 
+0

したがって、autoflush()がsession.flush()をトリガーします。 sesson.flush()がトリガーされる前に、更新、削除、挿入操作はトランザクションに追加されません。 – 8090PZ

関連する問題