2017-12-05 35 views
0

세션 객체를 만들 때 주기적으로 flush()를 실행하도록 구성 할 수 있습니까?SQLAlchemy session.flush()를 주기적으로 구성하는 방법

이 기능이 필요한 이유는 세션의 범위에서 비 단기 배경 작업이 메모리에서 실행되고 있기 때문입니다. 나는이 프로그램이 정기적으로 flush()를 사용하여 DB의 작업 진행 상황을 업데이트하여 내 클라이언트가 DB로부터 진행 상황을 쿼리 할 수있게하려고한다.

현재 내 솔루션에서는 정기적으로 session.flush()를 실행하는 다른 스레드를 사용하고 있습니다.

감사합니다.

+1

다른 클라이언트가 변경 사항을 볼 수있게하려면'commit()'을 호출해야합니다. 'flush()'도 작동한다는 사실은 사용하고있는 격리 수준의 부작용입니다. 목표를 달성하려면 작업의 진행 상태를보고 할 때마다 모델을 업데이트하고 커밋하십시오. 별도의 스레드가 필요 없습니다. – univerio

+0

'commit()'을 가져 주셔서 감사합니다. 몇 가지 실험을 한 후 세션의 트랜잭션 수준이 반복 읽기이지만 클라이언트가 커밋되지 않은 업데이트를 읽을 수 있음을 알았습니다. 왜 이런 일이 일어나는 지 아십니까? – 8090PZ

+0

당신은'autoflush'를 켜고 autoflush를 트리거하거나'autocommit'을 on으로 설정합니다. – univerio

답변

0

코드에서 session.flush() 번으로 다시 전화 할 필요가 없습니다. 기본적으로 SqlAlchmey autoflush은 True로 설정됩니다. 즉, 모든 업데이트, 삭제, 삽입 작업이 이미 커밋을위한 transeaction에 추가되었다는 의미입니다. 따라서 DB에 대한 모든 쿼리는 항상 최신 데이터를 가져옵니다. 즉, 선택한 쿼리가 시작된 경우에도 커밋되지 않은 변경이 먼저 커밋되어야합니다.

In [8]: session.autoflush 
Out[8]: True 

In [9]: session.autocommit 
Out[9]: False 
+0

그래서 autoflush()가 session.flush()를 트리거합니다. sesson.flush()가 트리거되기 전에 모든 업데이트, 삭제, 삽입 작업이 트랜잭션에 추가되지 않습니다. – 8090PZ