Database
: Index라는 순서로 데이터들을 정렬시켜 저장해놓음. 일반적으로 파일로 저장됨.
이 파일(DB)을 열어보기 위한 프로그램이 아래 RDBMS 또는 NoSQL.
1) SQL(RDBMS)
: 관계형 데이터베이스. 행/열의 생김새가 정해진 Excel에 데이터를 저장하는 것과 유사. 정형화됨. 데이터 변경이 자주 일어나는 경우 유리.
ex. SQLite, MS-SQL, My-SQL, MySQL, MariaDB, Oracle, PostgreSQL등
장점
- 스키마가 명확하게 정의되어 있다.
- 데이터 무결성을 보장한다.
- 각 데이터를 중복 없이 한 번만 저장한다.
단점
- 유연성이 떨어져 데이터 스키마를 사전에 계획해야 하므로 추후 수정이 어렵다.
- 관계를 맺고 있어서 조인문이 많은 복잡한 쿼리가 만들어질 수 있다.
- 대체로 수직적 확장만 가능하다.
2) NoSQL
: 비관계형 데이터베이스. 딕셔너리 형태로 데이터를 저장해두는 DB. 자유로운 형태의 데이터 적재. 데이터 유형에 따라 다양한 유형을 갖추고 있으며, 주요 유형으로는 문서, 키 값, 와이드 컬럼, 그래프 등이 있다. NoSQL이라고 해서 꼭 스키마가 없는 것은 아니다. 유연한 스키마를 제공하며, 대량의 데이터와 높은 사용자 부하에서도 손쉽게 확장할 수 있다는 점이 큰 장점이다. 또한 데이터를 읽어올 때 스키마에 따라 데이터를 읽어 온다. 읽기를 자주 하지만 데이터 변경이 없는 경우 유리.
ex. MongoDB, Redis, CouchDB, CouchBase, Hadoop, Apache Cassandra 등
장점
- 스키마가 없기 때문에 유연하고 언제든지 저장된 데이터를 조정하고 새로운 필드를 추가할 수 있다.
- 데이터는 애플리케이션이 필요로 하는 형식으로 저장되기 때문에 데이터를 읽어오는 속도가 빨라진다.
- 수직 및 수평 확장이 가능해서 애플리케이션이 발생시키는 모든 읽기와 쓰기 요청 처리가 가능하다.
단점
- 유연성으로 인해 데이터 구조 결정을 미루게 될 수 있다.
- 데이터 중복을 계속 업데이트해야 한다.
- 데이터가 여러 컬렉션에 중복되어 있기 때문에 수정이 필요한 경우 모든 컬렉션에서 수행해야 한다.
실습
- 우선 SQLite3 Editor 확장 프로그램을 설치하고 환경설정을 해줘야함.
- database.db 파일 생성 후 해당 파일을 마우스 우클릭, 연결 프로그램.. 클릭
- .db에 대한 기본 편집기 구성.. 클릭, SQLite3 Editor 클릭.
- database.db창 닫은 후 database.db 파일 삭제.
이제 사용하기 !
- 명령팔레트 열고 가상환경 만들기.
- 라이브러리 설치 pip install Flask-SQLAlchemy
- app.py 파일 생성.
- database.db 파일 생성.
- app.py에 다음 코드 작성.
from flask import Flask
import os
from flask_sqlalchemy import SQLAlchemy
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] =\
'sqlite:///' + os.path.join(basedir, 'database.db')
db = SQLAlchemy(app)
이 아래에 설계도 작성.
예를 들어, 노래에 대한 데이터를 저장하고자 하는 경우 다음과 같이 작성.
class Song(db.Model): #설계도. Song이라는 이름의 시트가 만들어진다.
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String, nullable=False)
artist = db.Column(db.String, nullable=False)
title = db.Column(db.String, nullable=False)
image_url = db.Column(db.String, nullable=False)
def __repr__(self):
return f'{self.artist} {self.title} 추천 by {self.username}'
with app.app_context():
db.create_all()
- 이제부터 터미널에서 작성 !!!
[테이블 만들기]
flask shell
>>> from app import db, Song
>>> db.create_all()
반대로, 테이블을 없애고 싶다면 db.drop_all()
이제 데이터를 집어넣는다.
song1 = Song(username="추천자", title="노래제목1",
artist="가수1", image_url="이미지 주소1")
song2 = Song(username="스파르타", title="노래제목2",
artist="가수2", image_url="이미지 주소2")
song3 = Song(username="스파르타", title="노래제목3",
artist="가수3", image_url="이미지 주소3")
db.session.add(song1)
db.session.add(song2)
db.session.add(song3)
db.session.commit()
- 모든 결과값 보기 → 테이블이름.query.all()
- 리스트 형식으로도 사용 가능!
song_list = Song.query.all()
song_list[0]
song_list[0].title
- 특정 조건으로 데이터 가져오기 → 테이블이름.query.filter_by(username='추천자').all()
- 데이터 1개 가져오기 → 테이블이름.query.filter_by(id=번호).first()
- 데이터 수정하기 → db.session.add(데이터)
- 데이터 삭제하기 → delete_data = Song.query.filter_by(id=4).first()
db.session.delete(delete_data)
- db.session.commit() 도 잊지말고 변경이 일어날 때마다 해주기.