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를 사용할 때에는 유의하여야 한다.
'Python > sqlalchemy' 카테고리의 다른 글
SQLAlchemy Session과 AsyncSession은 synchronizable한 객체일까? (0) | 2024.02.23 |
---|---|
sqlalchemy로 MySQL 연결 시 필요한 라이브러리 (0) | 2024.01.02 |
sqlalchemy logging 옵션 끄기 (0) | 2024.01.02 |
sqlalchemy에서 joinedload와 Query.join()의 차이점 (2) | 2023.10.22 |