2016-11-29 1 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) 

두 개의 연결이 사용됩니다 (미세하다)하지만 객체가 데이터가없는 :

호기심 것은 내가 그렇게 할 때이다.

+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

관련 문제