DB를 쓰는 이유: 데이터를 잘 찾기 위해서
SQL
행/열의 생김새가 정해져있음
셀에 데이터를 저장하는 것과 유사
데이터의 일관성, 분석에 용이
비즈니스가 잘 안바뀌는 곳에서 사용하기 용이
ex) MS-SQL, My-SQL 등
NoSQL: Not Only SQL(SQL뿐만 아니다)
데이터 하나하나마다 다른값을 가질 수 있음
자유로운 형태의 데이터 적재에 유리
일관성 부족
ex) MongoDB
DB란 우리가 쓰는 프로그램과 같아서 DB를 설치하고 사용한다.
요새는 Cloud형태로 사용한다.
MongoDB
라이브러리 설치
$ pip install dnspython
$ pip install pymongo
pymongo로 접속
from pymongo import MongoClient
client = MongoClient('여기에 URL 입력')
db = client.dbsparta
URL입력하는 곳에 생성한 DB-connect-connect your application에서 DRIVER, VERSION 맞춰준 후 주소 복사
from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:<password>@cluster0.safzmwr.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta
그리고 password에 db생성시 입력한 암호(test) 입력
from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test>@cluster0.safzmwr.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta
여기까지 라이브러리를 부르는 작업
DB에 자료를 넣어보자
doc라는 딕셔너리를 생성한 후 db.users.insert_one(doc)로 넣어준다.
from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test>@cluster0.safzmwr.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta
doc = {
'name': '영수',
'age': 24
}
db.users.insert_one(doc)
그러면 DB에 업로드된다!
여기서 users는 큰 데이터베이스 안에 있는 collection, 묶어놓는 단위, 소그룹이라고 생각하면 된다.
pymongo 데이터 찾기
from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.safzmwr.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta
all_users = list(db.users.find({},{'_id':False}))
for a in all_users:
print(a)
실행하면 터미널 창에 dB에 입력되어있는 데이터가 출력된다.
저기서 '_id':False}는 id는 출력하지 않겠다는 뜻(데이터를 깔끔하게 볼 수 있음)
난 뭐가 문제인지 pymongo import에서 에러가 떠서 python dbprac.py 명령어로 실행이 가능하다.. > 라이브러리를 가상환경에 설치 안해서 그런거였음!!!! 가상환경에 설치하고 잘 실행됨 ㅎㅎ
데이터 하나만 가져오기
from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.safzmwr.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta
user = db.users.find_one({'name':'bobby'})
mongoDB 내용 업데이트
name이 영수인 데이터를 찾아서 age를 19로 업데이트
from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.safzmwr.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta
db.users.update_one({'name':'영수'},{'$set':{'age':19}})
DB에 영수age가 19로 업데이트 되어있음
pymongo 내용 삭제
from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.safzmwr.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta
db.users.delete_one({'name':'영수'})
DB에 영수가 삭제된다.
pymongo 코드 요약
# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)
# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})
# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{'_id':False}))
# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
# 지우기 - 예시
db.users.delete_one({'name':'bobby'})
웹 스크래핑 결과 DB에 저장하기
for tr in trs:
a = tr.select_one('td.title > div > a')
if a is not None:
title = a.text
rank = tr.select_one('td:nth-child(1) > img')["alt"]
star = tr.select_one('td.point').text
doc = {
'title' : title,
'rank' : rank,
'star' : star
}
db.movies.insert_one(doc)
이렇게 실행하면 db에 movies라는 collection이 새로 생기고 거기에 영화 데이터가 들어가있다!
실행 횟수만큼 데이터가 들어가게 되니 조심..ㅎ
데이터 찾기
1) 가버나움의 평점 가져오기
movie = db.movies.find_one({'title':'가버나움'})
print(movie['star'])
2) 가버나움과 같은 평점의 영화 가져오기
movie = db.movies.find_one({'title' : '가버나움'})
target_star = movie['star']
movies = list(db.movies.find({'star': target_star},{'_id':False}))
for a in movies:
print(a['title'])
3) 가버나움의 평점을 0으로 만들기
db.movies.update_one({'title':'가버나움'},{'$set':{'star':0}})