공감하기
본문 바로가기
  • [!] Manual from the past has just arrived
개발일지/Python

[PyMongo] 기본 transaction 정리

by Puilin 2023. 1. 6.

[용어 정리]

pymongo의 db는 RDBMS의 db와 동일하다.

collection은 RDBMS의 table에 대응된다.

document는 RDBMS의 row에 대응된다.


기본 transaction(insert, find, update, delete)을 사용하기 위해서 db와의 연결이 필요하다. 이 때 사용되는 것이 client 객체이다. 객체 생성에 필요한 인자들은 따로 정의되어 있으니 api 문서를 살펴보면 되겠다.

import pymongo

client = pymongo.MongoClient()

client 객체를 생성했으면 원하는 db에 접속한다. 두 가지 방법이 있다.

db = client.test_db
db = client['test_db']

test_db라는 이름을 갖는 db가 있으면 변수 db에 database 객체가 저장되지만 만약 존재하지 않을 경우 아무일도 일어나지 않는다. 이 점은 pymongo의 중요한 특징인데 실제로 insert를 통해 document가 하나 저장되어야 비로소 객체가 생성된다. (이는 collection도 마찬가지이다)

원하는 db를 불러왔으면 collection을 불러온다. 이 역시 두 가지 방법이 있다.

collection = db.test_collection
collection = db['test_collection']

[예제]

db는 회사, 각각의 collection은 부서를 나타낸다고 가정하자. 회사 내의 직원의 정보를 저장하는 데이터베이스를 구축하는 것이 목표이다.

db = client['my_company']
collection = db['HR']

[Insert]

회사 내 인사팀에 새로운 신입이 들어왔다. 사번은 202219, 이름은 홍길동이고 나이는 26세, 사는 곳은 부산이다.

이 직원의 정보를 회사 db에 추가해보자.

collection.insert_one({
    'id': 202219,
    'name': '홍길동',
    'age': 26,
    'resident': '부산'
})

[Update]

2022년이 가고 2023년이 되었다. 사원 홍길동의 나이도 어느덧 27세가 되었다. 회사 db에서 이 직원의 나이를 수정해보자.

collection.update_one({'id': 202219}, {'$set': {'age': 27}})

사번이 202219인 직원의 나이를 27로 설정한다는 뜻이다.

다음의 SQL문과 같은 의미를 가진다.

UPDATE HR SET age = 27
WHERE id = 202219

$set 자리에는 다양한 갱신 제한자가 올 수 있다. 작용되는 범위는 document 내에서만 한정된다.

$set 명시한 필드를 명시한 값으로 설정
$inc 명시한 필드의 값을 명시한 값만큼 증가
$push 해당하는 document가 존재하면 명시한 필드와 값을 새로운 열로 추가
해당하는 document가 존재하지 않으면 새로운 document를 생성하고 필드와 값 추가
$unset 명시한 필드와 값을 모두 제거

자주 쓰이는 건 $set과 $inc 정도이고 다른 종류도 많이 있으니 다음 글을 참고하면 될 듯 하다.

https://thalals.tistory.com/169

 

[MongoDB] 특정 값 증가 - Update 메소드와 $inc 제한자 ( 조회 수, 좋아요)

몽고디비에서 Update 메소드를 사용할 때 값을 수정하기위해 $set을 이용하는데, 이 set이 제한자이다. 제한자의 종류는 다양하고 기능 또한 다양합니다. 제한자의 구체적인 용어는 '갱신 제한자'로

thalals.tistory.com

[Find]

사번은 [연도] + [들어온 순서]로 결정된다. 홍길동보다 앞서 들어온 직원의 정보가 궁금하다. 찾아보자.

document = collection.find_one({'id': 202218'})
print(document['name'])

[Delete]

오랜 야근으로 더 이상 버티기 힘들어진 홍길동 사원은 그만 퇴사해버리고 만다. 회사 db에서 이 직원의 데이터를 삭제하자.

collection.delete_one({'id': 202219})

'개발일지 > Python' 카테고리의 다른 글

[Python] Call-by-value vs Call-by-reference  (0) 2023.11.16