웹 개발을 하다보면 클라이언트의 정보 혹은 API로 받은 정보를 저장해야 할 때가 있다.
물론 서버가 계속 돌아갈때는 배열(리스트)나 객체(딕셔너리)에 담을 수 있다.
그러나 서버가 불안정하여 종료되거나 전원의 미공급으로 인해 프로그램이 종료될 경우 모든 정보가 휘발되어 버린다. 이를 방지하기 위하여 계속 필요한 정보들은 DB라는 곳에 저장해둔다.
크게 SQL(RDBMS)과 NoSQL이 있다.
행/열의 생김새가 정해진 Excel에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
ex) SQLite, MS-SQL, My-SQL 등
딕셔너리 형태로 데이터를 저장해두는 Database입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
ex) MongoDB
우리는 SQL 중 SQLite를 사용해 볼 것이다.
pip install Flask-SQLAlchemy
#app.py 기본 원형(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)
#DB에 들어갈 테이블 원형
#DB의 column을 정한다.
class Song(db.Model):
id = db.Column(db.Integer, primary_key=True)
#int(정수형 , primary_key는 DB의 index로 중복 허용X
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()
위의 DB로 CRUD(create,read,update,delete)를 해봅시다.
song1 = Song(username="추천자", title="노래제목1",artist="가수1", image_url="이미지 주소1")
db.session.add(song1)
각 column에 맞는 데이터를 입력후 db.session.add(song1)으로 DB에 넣어준다.
#모든 값 출력
Song.query.all()
#조건에 맞는 값 출력
Song.query.filter_by(조건).all()
모든 DB의 출력을 원하는 경우 all()을 , 특정 데이터의 출력을 원하는 경우 .filter_by()를 사용해준다.
song_data = Song.query.filter_by(id=4).first()
song_data.title = '변경된제목'
db.session.add(song_data)
db.session.commit()
query.filter_by를 이용하여 update하고자 하는 데이터를 선택하여 바꾸고자 하는 column의 데이터를 수정 후 commit 해준다.
delete_data = Song.query.filter_by(id=4).first()
db.session.delete(delete_data)
db.session.commit()
update와 마찬가지로 delete하고자 하는 데이터를 선택하여 delete해준 후 commit 해준다.