何度も渡されるセッション オブジェクトがあり、ある時点で次のコード行が呼び出されます (これは避けられません)。
import transaction
transaction.commit()
これにより、セッションが使用できなくなります(閉じることにより)。
私の質問は2つの部分です:
- セッションがまだ有効かどうかを確認するにはどうすればよいですか?
- 死んだセッションを復活させる簡単な方法はありますか?
2 の場合: 私が現在知っている唯一の方法は、sqlalchemy.orm.scoped_session を使用してから、query(...)get(id) を何度も呼び出して、必要なモデル インスタンスを再作成することですが、これは非常に効率が悪いようです。
編集
エラーの原因となる一連のイベントの例を次に示します。
modelInstance = DBSession.query(ModelClass).first()
import transaction
transaction.commit()
modelInstance.some_relationship
そして、ここにエラーがあります:
sqlalchemy.orm.exc.DetachedInstanceError: Parent instance <CategoryNode at 0x7fdc4c4b3110> is not bound to a Session; lazy load operation of attribute 'children' cannot proceed
遅延読み込みをオフにしたくありません。
編集
DBSession.is_active は、この場合、セッションが実際に有効であるかどうかを示すものではないようです。
transaction.commit()
print(DBSession.is_active)
これはTrueを出力します...
編集 これはコメントするには大きすぎるように思えたので、ここに入れます。
zzzeek 氏は次のように述べています。
では、これが起こるようにコミットするにはどうすればよいでしょうか? transaction.commit の呼び出しが間違っています。正しい方法は何ですか?