Flask session object 정리, flush와 commit은 무엇인 다른가?
2022-04-03
기본적으로 세션 오브젝트는 update, insert, delete와 같이 데이터베이스의 트랜잭션을 지속적으로 변화시키는 작업을 한다.
이러한 작업들은 commit이 되기 전에는 영속적이지 않다. 즉, 메모리에만 있기 때문에 영구적으로 보관할 수 있도록 추가 작업이 필요하다.
session.add()
를 통해 세션 오브젝트를 트랜잭션에 등록할 수 있다.
session.flush()
로 데이터베이스와 소통을 한다. 즉, session.flush()
를 수행하기 전에는 아직 데이터베이스와 소통하지 않은 상태이다.
데이터 베이스는 flush된 데이터들을 트랜잭션에서 보류 상태로 유지한다. 데이터가 어떻게 들어갈지 결정은 되었으나 DB에 반영이 된 상태는 아니다.
session.commit()
은 이러한 변화를 데이터베이스에 영구적으로 만든다.
flush()
는 commit()
일부로 호출된다. session 기본 설정 중 autoflush가 true인 것과 관련이 있다.
그래서 실제 코드를 작성할 때 id 값이 db에서 auto increment라 orm에 정의를 하지 않아서 트랜잭션 도중 해당 모델에서 id를 가져오고 싶은데 못 가져오는 경우 아래와 같이 하면 id 값을 가져올 수 있다.
a = AAA()
a.flush()
a.id
원문 : https://stackoverflow.com/questions/4201455/sqlalchemy-whats-the-difference-between-flush-and-commit