セッションはこのように機能するように設計されています 。セッションBのオブジェクトの属性は、セッションBで最初にクエリされたときの属性を保持します。さらに、SQLAlchemyは、他のセッションのオブジェクトが変更されたときに自動的に更新しようとはしません。また、何かを作成しようとするのも賢明ではないと思います。このように。
各セッションの存続期間は、データベース内の単一のトランザクションとして積極的に考える必要があります。オブジェクトが古くなっている可能性があるという事実にセッションがいつどのように対処する必要があるかは、SQLAlchemy(またはSQLAlchemyの拡張機能)に組み込まれたアルゴリズムによって解決できる技術的な問題ではありません。自分で決定してコーディングします。 「正しい」応答は、これは問題ではないということかもしれません。セッションBで発生するロジックは、セッションBの開始時にデータを使用した場合に有効である可能性があります。あなたの「問題」は実際には問題ではないかもしれません。ドキュメントには実際には
とはいえ、状況の仕組みを変えるためにできることがいくつかあります。
まず、セッションを開いたままにする時間を減らすことができます。セッションBはオブジェクトをクエリしていますが、後でそのオブジェクトを使用して(同じセッションで)属性を最新の状態にしたいことを実行しています。 1つの解決策は、この2番目の操作を別のセッションで実行することです。
もう1つは、 docsのように、expire/refreshメソッドを使用することです。表示 ...
# immediately re-load attributes on obj1, obj2
session.refresh(obj1)
session.refresh(obj2)
# expire objects obj1, obj2, attributes will be reloaded
# on the next access:
session.expire(obj1)
session.expire(obj2)
session.refresh()
を使用できます セッションが以前にオブジェクトを既に照会した場合でも、オブジェクトの最新バージョンをすぐに取得します。