2016-11-29 75 views
0

私のプロジェクトではormにsqlalchemyを使用しています。私の問題は、session.close()が呼び出されるまでsession.refresh(obj)の新しいdb接続が使用されるたびに保持されることです。 私は複数のオブジェクトをリフレッシュしたいとき、すぐに接続が不足します。SQLAlchemy session.refresh()は新しい接続を作成します

セッションメーカー:

session = session_maker() 
try: 
    yield session 
    session.commit() 
    for obj in session: 
     session.refresh(obj) 
except Exception as e: 
    session.rollback() 
    raise e 
finally: 
    session.close() 

使用法:私はアップデートで満たされている列を持っていると私は、現在の値を返すようにしたいので、私はリフレッシュを使用しています

with make_session(...) as session: 
     for mapped in [self._mapper.map(obj) for obj in objects]: 
      saved_entities.append(mapped) 
      session.add(mapped) 
     session.flush() 

for obj in session: 
    session.commit() 
    session.refresh(obj) 

2つの接続のみが使用されている(罰金である)が、オブジェクトはデータがない:

好奇心旺盛なことは、私はそれを行うときということです。

+0

私は 'session.refresh(obj)'の後に 'session.connection()。close()'を試みましたが、成功しませんでした。 – literg

答えて

0

使用scoped_session、そうした場合、あなたは同じセッション(接続ID)あなたがそれを要求するたびに取得しますhttp://docs.sqlalchemy.org/en/latest/orm/contextual.html

を参照してください。また、refresh()を呼び出す必要はありません。add()とflush()で十分です。更新された値はflush()の後とcommit()の前に使用できます。それらを検索するための同じセッションID(データベーストランザクション)(したがって、scoped_sessionが必要です)。

+0

残念ながらそれは役に立たなかった。他のプロポーザルcommit()はオブジェクトの内容をパージしますが、フィールドにアクセスしようとすると、オブジェクトはリフレッシュされます。私の場合、コミット後のオブジェクトはセッション外で使用されるため、これは起こっていません。興味深いのは、私は最小限の複製可能な例を作成しようとしていますが、sqlalchemyの使用法を実装したときにはうまくいきました。 – literg

関連する問題