>

TIL

1주차 Day4. DB, SQLite

ekdud 2024. 6. 27. 15:24

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() 도 잊지말고 변경이 일어날 때마다 해주기.