Python으로 SQLite, MongoDB 접근해보기
Web/Database

Python으로 SQLite, MongoDB 접근해보기

1. Relational Database Management System

: 관계형 데이터베이스 관리 시스템

=> Oracle , mysql (가장 기본적인 db 시스템), my SQL,

: 표가 있고, 각 항목 별로 데이터가 정리되어있는 2차원 형태의 데이터베이스

 

2. Structured Query Language : 구조화 된 질의 언어 

SQL을 이용해서 RDBMS에 저장된 데이터와 통신을 하게 된다.

ex) CRUD : 데이터를 create, read, update, delete 하는 등 데이터를 계속 서버와 통신하면서 데이터베이스를 구축해 갈 수 있다.

=> 각 데이터가 들어갈 schema이 다 정해져 있다. 따라서 Schema에 해당하는 데이터만 데이터베이스에 들어갈 수

수 있다.

 

3. NoSQL

: sql을 사용하지 않는 비관계형 데이터베이스 모델이다.

=> 굉장한 확장성을 가지고 있다. 많은 기업들이 noSQL로 전환하는 중

ex) MongoDB : 현재 웹사이트를 만들 때 사용해볼 database이다.

 

 

+) SQLite

: 로컬의 단일 파일 한개로 운영되는 데이터베이스0 언어.

=> 예전에 했던 MYSQL recap해볼겸 다시 짜봤다.

import sqlite3

conn=sqlite3.connect("test.db")
cur=conn.cursor()
#variable that helps communicate with db


query = """
  CREATE TABLE IF NOT EXISTS board(
  'idx' INTEGER PRIMARY KEY AUTOINCREMENT,
  'writer' VARCHAR(100), 
  'title' VARCHAR(250),
  'contents' TEXT)
 """
cur.execute(query)

query="""INSERT INTO board('writer','title','contents') VALUES ('홍길동','제목','내용')"""
cur.execute(query)

#commit을 통해 확정을 시켜야 한다. transaction을 이용.

query="SELECT * FROM board"
cur.execute(query)

rows=cur.fetchall()
for row in rows:
   print(row)

query="DELETE FROM board WHERE idx=1"
cur.execute(query)
conn.commit()

 

 

# MongoDB

https://poiemaweb.com/mongdb-basics

 

MongoDB Basics - Install | PoiemaWeb

MongoDB의 기본 개념과 설치 RDMS와 MongoDB의 비교

poiemaweb.com

=> no-sql 방식으로 이루어졌으며, 각 데이터들은 binary json 형태의 document들로 이루어져 있다.

 

#CREATE

import pymongo

m={ "이름":"홍길동",
    "나이":30,
    "거주지":"서울",
    "키":179,
    "몸무게":80,
    "프로필사진":[
        "a.jpg",
        "b.jpg"
    ]
}

m2={
    "이름":"홍길동",
    "나이":30,
    "학교":"inha",
    "몸무게":80,
    "프로필사진":[
        "a.jpg",
        "b.jpg"
    ]
}
# binary 형태의 document 형태로 각 데이터들이 들어간다 (binary 형태의 json형태)
# text 모드로 보면 json 형태처럼 보이기도 한다.

conn=pymongo.MongoClient("localhost",27017)
db= conn.test
#test라는 이름의 db 생성
col=db.members
# column이 생긴다.
col.insert(m2)
#col.insert(m1)

 

 

object 형태로 데이터가 들어가 있다

=> 각 schema를 정해줄 필요 없이 데이터들을 문서 형태로 아무렇게나 그냥 원하는 데이터를 넣어줄 수가 있다.

: Schema가 명시되어있지 않기 때문에 따로  error가 나지 않는다.

: 한 document의 size가 16MB를 넘겨서는 안된다. (사실 엄청난 양이기 때문에 16mb를 넘는 경우는 잘 없다.)

+) MongoDB 자체가 굉장히 메모리 의존적인 프로그램이라 메모리가 클수록 성능이 좋아진다.

 

=> Test 라는 DB 아래에 Table 역할을 하는 collection이 삽입되어있고, 그 안에 데이터들이 존재한다

 

 

#READ

find 함수를 통해 데이터를 읽어올 수 있다.

 

+) 조건을 따로 주고 싶다면

 results= col.find({ "학교" :"inha", "나이":30})

로 해당 조건에 맞는 데이터를 찾을 수 있다. (대신, And 연산으로, 둘다 만족하는 데이터가 나온다.)

 

+) OR 형태로 데이터를 읽고 싶다면 

results=col.find({"$or":[{"이름":"홍길동"},{"학교":"inha"}]})
#cursor 에 있는 데이터를 한줄한줄 읽어와야 된다.
# or 연산이므로, 만족하는 조건이 한가지라도 있어도 해당하는 데이터가 모두 출력된다.
for r in results:
    print(r)
results=col.find({"나이": {"$gt":30}})
#30보다 나이가 많은 데이터를 찾아서 출력한다.

# $gte는 greater & equal

results=col.find({"나이": {"$gt":30}, {"$lt":100}})
# $gt: 50, $lt :100 이렇게 하면 30보다 크고 100보다 작은 데이터가 출력될 것이다.

results=col.find({"나이": {"$gt":30}, {"$lt":100}}, {"_id":False, "이름":True})
#특정 필드만 언급하고 싶다면, 이름만 나오게 된다. 아이디는 기본값이라 늘 나오니까
#아이디 나오는게 싫으면 항상 false로 만들어줘야함.

results=col.find({"나이": {"$gt":30}, {"$lt":100}}, {"_id":False, "이름":True}).skip(1).limit(3)
#1번데이터는 skip하고 그 이후로 3개만 취해서 출력함
#skip(10).limit(10)=> 게시판 페이지 넘길 때 쓴다.

results=col.find({"나이": {"$gt":30}, {"$lt":100}}, {"_id":False, "이름":True}).sort(-1).skip(1).limit(3)
#sort 1이면 내림차순, sort -1이면 오름차순.

 

 

 

results=col.find_one({"이름":"홍길동})
#이름인 홍길동인 데이터를 딱 하나만 단수로 가져온다.

 

 

#UPDATE

import pymongo

conn=pymongo.MongoClient("localhost",27017)
db= conn.test
#test라는 이름이 있으면 접근, 없으면 새로 db 생성(오타 주의할것)
col=db.members
# collection이 생긴다.

#잘못된 예시 
#col.update=({"이름":"홍길동"},{"이름":"박길동"})
#이름을 바꾸고 싶다고 특정 필드만 언급하면, 그 필드만 update되고 나머지 필드는 싹 사라진다
#따라서 전체적인 document를 다 update시켜버리는게 된다.

#따라서 특정한 field만 바꾸고 싶다면?
col.update({"이름":"홍길동"},{"$set":{"이름":"윤길동"}},upsert=True, multi=False)
#multi 값이 True면 조건에 해당하는 모든 데이터를 update한다.
#multi 값이 false면 하나만 update한다.
#Upsert 값을 넣으면 존재하지 않는 데이터는 insert가 된다.

col.update({"이름":"가제트"},{"$set":{"이름":"윤길동"}},upsert=True, multi=False)
#따라서 "이름":"가제트"가 존재하지 않아도, upsert를 추가하면 insert가 된다.

results= col.find({"이름":"윤길동"})
for r in results:
    print(r)

 

 

#Delete

col.remove({"이름":"가제트"})
#가제트라는 이름을 가진 데이터가 remove된다.

col,remove({})
#아무것도 안넣으면 전체 db가 drop된다. 조건을 넣고 조심하자.

col.delete_one({"이름":"가제트"})
#하나만 삭제함

col.delete_many({"이름":"가제트"})
#이름이 가제트인 모든 데이터를 delete


col.update({"이름":"가제트"},{"$inc":{"몸무게":10})
#몸무게를 10 증가시킬 수도 있다.

'Web > Database' 카테고리의 다른 글

논리적 데이터베이스 모델링  (0) 2022.02.23
Amazon RDS 데이터베이스 구축(MySQL)  (0) 2022.02.22
ERD, 어떻게 설계하는 걸까?  (2) 2022.02.21
MySQL 정리  (0) 2020.01.19