Python/sqlalchemy

SQLAlchemy에서 session.commit()과 session.flush()의 차이

검정비니 2024. 2. 23. 14:31
728x90
반응형

SQLAlchemy를 사용해서 어떤 데이터를 추가/변경 또는 삭제를 할 때 session.commit() 메소드와 session.flush() 메소드가 자주 사용되어지곤 한다.

 

기본적으로 둘 다 모든 적용되지 않은 변경 사항들을 저장하는 역할을 하나, session.commit()의 경우에는 한가지 추가적인 작업을 진행하게 되는데, 바로 연결된 모든 객체들을 expire 처리하고 다시 로딩을 한다는 점이다.

이 기능을 하는 여러가지 이유가 있겠지만, 대표적인 이유 중 하나로는 INSERT 후에 autoincrement id 값을 가져오기 위해서가 있다.

 

복잡한 비즈니스 로직을 구현하다보면 M:N의 문제들이 많이 발생하게 되는데, 이러한 경우 primary key들을 저장하는 매핑 테이블이 존재하기 마련이다.

M:N 관계의 정보를 저장하기 위해 primary key 값을 알아야 하기에 자동으로 데이터를 리로딩하기 위해 이러한 expire and reload 정책이 추가되게 된 것이다.

 

또한, commit을 했다고 하더라도 또다른 작업을 진행해야 할 수도 있을텐데, 이때 가장 최신의 데이터베이스 상태를 가져오도록 함으로써 더 안정적인 모델링을 가능하게 만드는 것이다.

 

이러한 expire and reload 정책이 마음에 들지 않는다면 Session.expire_on_commit 매개변수를 False로 설정해서 commit이 되어도 데이터 리로딩이 일어나지 않도록 막을 수 있다.

 

추가적으로, SQLAlchemy 2.0 기준으로 이러한 expire and reload 기능은 asyncio 기반의 API들에서는 사용할 수가 없기에 AsyncSession과 asyncio를 사용할 때에는 유의하여야 한다.

 

반응형