Python(flask)으로 mongoDB 제어하기 – pymongo

해당 글을 작성하기 앞서 NoSQL에 대한 언급이 단 한번도 없었다. 따라서 RDBMS와 NoSQL의 차이를 간단하게 언급하고 pymongo를 통한 mongoDB 제어방법을 알아보자.

What is NoSQL

일단 NoSQL이 무엇의 약자인지 확인을 하자. 현재 Not Only SQL, None-Relational Operational Database SQL로 의견이 엇갈린다 하지만 Not Only SQL로 풀어 설명하는 것이 다수를 차지한다.
기존 RDBMS가 갖고있는 특성 뿐 아니라 다른 특성을 부가적으로 제공함으로써 기존의 RDBMS의 한계를 극복하기 위해 만들어진 새로운 형태의 Database인 것을 알 수 있다.

기존 RDBMS와 NoSQL의 차이점을 말 하자면
– 관계형 모델을 사용하지 않고 JOIN 기능을 제공하지 않는다.
– 대부분 여러 대의 데이터베이스 서버를 묶어서(클러스터링) 하나의 DB를 구성한다.
– 대부분 Open Source로 제공한다.
– 고정된 Schema가 존재하지 않는다.

위 특징을 통해 판단하기에 NoSQL은 비정형 데이터 수집 및 가공을 위한 저장용도로 특히나 용이하다.

So mongo is…

우리가 사용할 mongoDB역시 NoSQL이다.

필자는 Docker의 Mongo image를 통해 환경을 구성했다.

나는 간단하게 RDBMS 에서 사용되던 개념을 MongoDB에 매핑하여 설명할 것이다 먼저
Database안에 기존에는 Table이 있었으면 NoSQL안에는 Collection이 있다.
그리고 Table 아래 Tuple/Row가 있었다면 MongoDB에는 Document가 있다.

이제 Document가 뭔지 알아보자!

{ 
    "_id" : ObjectId("5f5df3e885f820e8b6d6aab2"),
    "username" : "5linesys", 
    "name" : { "first" : "S.S.", "last" : "O" } 
}

일단 보자 그냥 JSON 같이 생기지 않았는가? 반가워하고 알던 대로 이해하면 된다.
key, value로 구성되어있다. 그리고 _id는 12byte의 hexadecimal이다. 해당 id를 통해 uniqueness를 제공한다. Document를 보니 Document의 집합인 Collection에 과연 Schema가 존재할 것 같은가? 역시나 Collection에 Schema가 없으며 Document는 Dynamic한 Schema를 갖고 있다고 할 수 있다.

마지막으로 굳이 별도로 mongo는 Database, Collection을 생성하고 Document를 넣을 필요 없이 그냥 사용하고 싶은 Database명을 use명령어를 통해 전환하고 해당 DB에서 어떤 Collection에 Document를 삽입한다면 DB, Collection, Document까지 한번에 생성된다 이미 존재하는 DB와 Collection이라면 따로 생성하지 않고 기존에 존재하는 것을 이용한다.

Now, We can use pymongo

이제 우리는 pymongo를 설치하고 사용할 것이다. 기반이 되는 내용은 위에서 이미 언급하였다. 설치는 아래 명령어를 통해 가능하다.

$ pip install pymongo

아래는 flask를 통해 http API를 만들어 Get method로 받은 인자를 DB에 저장하는 코드이다.

from flask import Flask, jsonify, request
from pymongo import MongoClient

# db 연동
conn = MongoClient('127.0.0.1')

# db 생성
db = conn.gps_saver

# collection 생성
collect = db.data

app = Flask(__name__)


@app.route('/', methods=['GET'])
def list_library():
name = request.args.get('Name')
lat = request.args.get('Lat')
lon = request.args.get('Lon')
time = request.args.get('Time')

# document 생성
doc = {
"Name": name,
"Lat" : lat,
"Lon" : lon,
"Time" : time
}
# document 삽입
collect.insert(doc)

return jsonify({"code": 0, "msg": "Storage completed"})


if __name__ == '__main__':
app.run()

마음이 미워질 정도로 간단하다… 이제 그냥 개발로 밥벌어 먹는게 어려울 것 같다 GCP로 서버 구성하고 Docker로 환경구성하고 flask와 pymongo의 조합으로 간단하게 필요한 정보를 저장하는 API 및 서버 구성까지 한시간도 안걸리게 할 수 있다.

마지막.. 종합선물세트 이것만 봐도 됨

# Document 삭제
# db.collction.remove() -> collect.remove()
collect.remove({'name': '5linesys'})

# Document 수정 
# db.collection.update -> collect.update()
myquery = {'name': 'linesys'}
newvalues = { '$set': { 'name': '5linesys'}}
collect.update(myquery, newvalues)

# 전체 Document 조회
result = collect.find()
for docs in result :
    print(docs)

# 특정 Document 조회
result = collect.find({'name': '5linesys'})

조회는 여기 참고하는게 더 좋을 것 같음

잘못된 정보 혹은 오타는 댓글로 알려주세요. 훈수도 환영.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다