반응형
이전 게시글에서 DB 에 접근하는 방법과 DB 에 데이터를 반영하는 방식에 대해 설명하였는데 정리하자면 다음과 같다.
- SQLAlchemy 에서는 session 이라는 영역에 DB 에 반영할 데이터를 저장하고 있다가 flush 나 commit 등을 수행하면 DB 에 반영된다
- 이전의 DB 연결방법인 Flask app 객체를 SQLAlchemy 생성자에 전달해서 DB 커넥션을 하는 방법에서는 SQLAlchemy.session 변수로 자동 생성된 session 을 이용할 수 있다
이번 포스트에서는 session 을 제어하는 여러 방법을 이야기하고자 한다.
session 을 제어하는 방법
session.begin()
- 이 메소드를 호출하면 해당 세션에 대한 데이터베이스 작업은 이 트랜잭션의 일부가 된다.
- 명시적으로 트랜잭션을 시작하고 싶을 때 사용합니다.
session.add()
- 새로운 객체를 현재 세션의 트랜잭션에 추가하게 된다. 아직 데이터베이스에는 커밋되지 않은 상태이다.
session.flush()
- 현재 트랜잭션의 모든 변경 사항을 데이터베이스에 반영하지만, 트랜잭션을 종료하지는 않는다.
- 임시적으로 데이터베이스에 변경 사항을 쓰지만, 트랜잭션은 여전히 열려 있으며 롤백될 수 있다. (begin -> insert 문을 수행하고 commit 문은 수행안한 것)
- 객체의 primary key id 와 같은 필드를 데이터베이스에서 미리 가져오고 싶을 때 유용하다.
session.commit()
- 현재 트랜잭션에 대한 모든 변경 사항을 데이터베이스에 영구적으로 저장하고 트랜잭션을 종료한다. 이 시점에서는 실제로 데이터베이스에 적용되었고. rollback을 해도 돌아오지는 않는다.
- 데이터베이스의 변경 사항을 확정하려고 할 때 사용됩니다.
session.rollback()
- 현재 트랜잭션에서 발생한 모든 변경 사항을 되돌린다. 오류 발생시 DB 를 되돌리기 위해 하는 것인데, commit 되지 않은 변경 사항들을 명시적으로 되돌리는 것이다
session.close()
- 현재 세션을 닫고, 사용 중인 모든 리소스를 정리하게 된다. 세션과 관련된 모든 연결과 자원이 해제되는데, 이 이후로부터는 해당 세션을 쓸수 없다
반응형
'개발자의 길' 카테고리의 다른 글
[Infra] Docker (1) - Docker Engine (0) | 2024.04.14 |
---|---|
[Java] Boxing 과 Unboxing (0) | 2024.01.22 |
[SQLAlchemy] SQLAlchemy 에서 DB 에 접근하는 방법 - 1 (1) | 2023.12.11 |
[Spring] 김영한의 스프링 핵심 원리 - 기본편 정리 (0) | 2023.07.16 |
[Network] OSI 7 Layer 정리 (0) | 2023.01.30 |