NoSQL, MongoDB (specifically MongoDB Atlas), Pymongo, XML/JSON/YAML
또한 JSON은 XML에 비해 압도적으로 간결하고, YAML은 JSON보다 더 간결하다.
라는 말이 있는 것처럼, xml -> json -> yaml으로 대체/발전되는 흐름으로 탄생 배경을 이해하면 될 것 같다. (물론 그렇다고 json이 xml보다 무조건 우수하다는 식으로 생각하면 곤란해~)수평확장
을 통해 많은 비용을 절감하는 방식으로 발전된다. (클러스터링, 네트워크 방식 등)RDB
- 테이블을 사전에 정의하고 그에 알맞은 형태의 데이터만 넣을 수 있다. (스키마) 그렇다보니 무결성이 높고 쿼리문을 통해 쉽게 원하는 데이터에 빠르게 접근할 수 있다.NoSQL
- 스키마가 없는 건 아니지만 여기서 스키마는 주로 데이터를 읽어올 때 쓴다고 한다. NoSQL은 데이터를 일단 넣어! 이기 때문에 기존에 RDB에 담기 어려웠던 다양한 형태의 데이터를 빠르게 적재할 수 있는 장점이 있다. (심지어 데이터의 구조가 없는 대용량의 데이터라도 말이다.) 또한 NoSQL은 수평확장을 하기 때문에 확장성 측면에서도 RDB에 비해 훨씬 유리하다. (서버 확장하는데 더 싸니까!) Document
형 데이터베이스다. dnspython
이라는 패키지가 필요하다고 한다. 참고. 오는 requirements.txt
에 있었는지 직접 설치하진 않았다.)Client
를 가장 처음 만들어줘야 한다. URI 방식 말고도 연결하는 방법은 더 있는 것 같다.from pymongo import MongoClient
client = MongoClient({URI})
# 참고: 'mongodb+srv://{유저 이름}:{유저 비밀번호}@cluster-prac.hubjn.mongodb.net/{기본 데이터베이스 이름}?retryWrites=true&w=majority'
# 데이터 베이스 생성/선택 (없는 데이터베이스면 생성됨)
db_1 = client["db_1"]
# 유사하게 컬렉션(테이블)도 조작 가능
collection_1 = db_1["new_collection"]
#컬렉션을 생성하면 데이터 넣기도 쉽게 가능하다.
collection_1.insert_one({"a":"hi", "b":[1, 2, {"c":"bye"}]})
# 데이터 검색 (가장 첫 값 가져오기)
doc_1 = collection_1.find_one()
print(doc_1)
_id
를 지정 안 해주면 자동으로 넣어주는데, 이게 데이터 고유번호이다!!! 오늘은 아래 실습을 해보았다.
- 주어진 Json 데이터를 MongoDB에 입력하기
- API를 통해 불러온 데이터를 MongoDB에 입력하기
- 첫 번째 문제와 다르게 이건 딱 하나의 데이터가 아니라서
insert_one
이 아니라insert_many
를 하는게 차이였다.- NoSQL에서 데이터 가져오기: 두 번째 문제에서 입력한 데이터 중
name
만 가져와서 set형태로 저장한다.
내가 적었던 코드 중 일부만 가져다 기록해둔다.
[주어진 Json 데이터를 MongoDB에 입력하기]
# MongoDB와 연결
client = MongoClient(MONGO_URI)
# db 생성 및 연결
db_1 = client[DATABASE_NAME]
# collection 생성 및 연결
collection_1 = db_1[COLLECTION_NAME]
# insert data
collection_1.insert_one(openweather)
[API를 통해 불러온 데이터를 MongoDB에 입력하기]
# MongoDB와 연결
client = MongoClient(MONGO_URI)
# db 생성 및 연결
db_2 = client[DATABASE_NAME]
# collection 생성 및 연결
collection_1 = db_2[COLLECTION_NAME]
# insert data
collection_1.insert_many(octokit)
# reference => https://pymongo.readthedocs.io/en/stable/tutorial.html#inserting-a-document => Search 'Bulk Insert'
octokit = ''
dont_touch= []
response = requests.get("https://api.github.com/users/octokit/repos")
# 주의할 점 : github API 는 호출이 너무 많이 발생하면 자체적으로 제한을 걸 수 있습니다.
# 한번의 API 호출 후 1초 sleep 시간을 지정합니다.
time.sleep(1)
if response.status_code == 200:
octokit = response.json()
dont_touch = copy.deepcopy(octokit)
[NoSQL에서 데이터 가져오기]
MongoDB와 연결
client = MongoClient(MONGO_URI)
# db 연결
db_2 = client[DATABASE_NAME]
# collection 연결
collection_1 = db_2[COLLECTION_NAME]
# 데이터 검색
res = collection_1.find()
# anwser
names = []
def Part_3_answer():
for data in res:
name = data['name']
names.append(name)
return set(names)
# print(Part_3_answer()) => 이걸로 잘 나오나 테스트했다.
# reference => https://pymongo.readthedocs.io/en/stable/tutorial.html#querying-for-more-than-one-document => 'Querying for More Than One Document'
getenv
를 통해서 별도의 파일에서 불러와서 할 수 있는 방법을 보았다! 예를 들어 env
파일 하나 만들어서 그 안에 공개되면 안되는 정보 입력해두고, gitignore
에 해당 파일 정보를 넣어두면 commit할 때 해당 파일은 안 올라간다. 그리고 해당 비밀번호를 써야하는 파일에서 해당 정보를 불러올 때 getenv
를 통해 불러올 수 있는 것. 나중에 한 번 써봐야겠다. 아마 필드가면 쓰게될 일이 많겠지?