現在、sqlalchemy が提供する scoped_session を autocommit=True および autoflush=True で使用しています。
スクリプトの実行が終了したときに、更新された結果の一部がフラッシュされないため、autoflush が適切に呼び出されないことに気付きました。
autoflush は、マルチスレッド環境で scoped_session を使用して実行することを意図していませんか?
現在、sqlalchemy が提供する scoped_session を autocommit=True および autoflush=True で使用しています。
スクリプトの実行が終了したときに、更新された結果の一部がフラッシュされないため、autoflush が適切に呼び出されないことに気付きました。
autoflush は、マルチスレッド環境で scoped_session を使用して実行することを意図していませんか?
autoflush は、マルチスレッド環境で scoped_session を使用して実行することを意図していませんか?
そのような制限はありません。
スクリプトの実行が終了したときに、更新された結果の一部がフラッシュされないため、autoflush が適切に呼び出されないことに気付きました。
これは autoflush の誤解です。自動フラッシュは、クエリがデータベースに SELECT を発行する前に、保留中のデータをデータベースにフラッシュすることを目的としています。ただし、オブジェクトの各属性が変更されるとすぐにデータがフラッシュされるという機能は提供されません。これは非常に非効率的であり、作業単位であるかどうかにかかわらず、あらゆる種類の ORM で実行できないためです。したがって、一連のオブジェクトを変更してから、それ以上操作せずにセッションを破棄すると、保留中の変更は失われます。
Autoflush は、トランザクションのコンテキスト内で使用することを目的としています。デフォルトの使用モードでは、Session がトランザクションを開始し、一連の変更を確定する準備が整ったときにのみ commit() を呼び出す必要があります。バックグラウンドhttp://docs.sqlalchemy.org/en/rel_0_7/orm/session.html#flushingのドキュメントと、http://docs.sqlalchemy.org/en/rel_0_7/で自動コミットを回避するための強力な推奨事項を参照してください。 orm/session.html#autocommit-mode .