Lina's Toolbox

[스파르타 내일배움캠프 AI웹개발 과정] 4일차 복습/db연동 본문

스파르타 내일 배움 캠프 AI 웹개발 과정/python

[스파르타 내일배움캠프 AI웹개발 과정] 4일차 복습/db연동

Woolina 2024. 6. 27. 16:36


URL 주소에서 데이터 가져오기

#app.py

@app.route("/iloveyou/<name>/")

def iloveyou(name)
	motto = f"{name}야 난 너뿐이야!"
    
    content = {
    	'name' : name,
        'motto' : motto,
    }

url에서 <변수명>으로 보낸 변수를

f"{변수}"로 사용 가능하다


페이지 이동 기능

<!-- html 파일 -->

href = "{{url_for('home')}}"

* url_for : 경로 지정


DB란

DB도 하나의 파일임. 이 파일을 열어보기 위한 프로그램(RDBMS)을 설치해야한다.

DB의 종류

1. SQL(RDBMS): excel과 유사하게 테이블(표) 형태로 데이터 저장. 표 형태로 깔끔. 데이터 오류가 낮고 일관성이 높지만, 그러므로 중간에 데이터를 더하거나 빼는 게 어렵다

2. NoSQL: 딕셔너리(키:밸류) 형태로 데이터 저장하므로 매우 자유롭고 하나하나 얽매이지 않음. 변화가 많아도 대응이 가능하므로 변화가 많은 스타트업에서 많이 사용한다.

ex. MongoDB


SQLite 

  • 작지만 빠르고 탄탄하여
  • 전세계적으로 가장 많이 사용되는 데이터베이스 중 하나
  • Python에 내장되어 있어 별도의 설치가 필요 없어 VScode에서 파일이름.db 형식으로 파일을 만들기만 하면 손쉽게 사용 가능
  • 보통 SQL 사용하지만 ORM(쉽게 얘기하자면 프로그래밍 언어)로도 다룰 수 있다.

 

SQLite3 Editor 확장 프로그램 설치하기

 

 

SQLite3 Editor 기본값으로 설정 

현재 폴더에서 database.db 파일 생성 후 연결 프로그램 SQLite3 Editor 기본값으로 설정 후 database.db 다시 삭제

 

 

설치 방법

 

1. Flask 구조의 폴더 생성 및 가상 환경 실행

 |— venv
|—app.py(서버)
|— database.db (데이터베이스)

+ 가상환경 활성화 해줌

 

2. Flask-SQLAlchemy 설치

pip install Flask-SQLAlchemy

 

(Flask 애플리케이션에서 SQLAlchemy를 쉽게 사용할 수 있도록 도와주는 확장 패키지)

* SQLAlchemy : Python의 ORM 라이브러리

 

3. app.py에 Flask와 Database를 연결하는 코드 작성

# SQLAlchemy 준비 코드

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)

 

 

4. app.py에 데이터베이스 모델 정의

class Song(db.Model):
    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()

 

이런 형태의 DB를 위해 사용한 클래스가 만들어진 것.

 

5. 테이블 만들기

(venv)가 있는지 확인!
$ flask shell (엔터)

 

* Flash shell 에서 나오는 방법
Ctrl + D: 터미널에서 Ctrl 키와 D 키를 동시에 누릅니다. 이는 현재의 쉘 세션을 종료하는 명령입니다.
exit() 명령어 사용: exit()을 입력하고 Enter 키를 누릅니다.
quit() 명령어 사용: quit()을 입력하고 Enter 키를 누릅니다.

 

 

DB 생성

 

>>> from app import db, Song (엔터)
>>> db.create_all()

만약 테이블을 없애고 싶다면 db.drop_all()

 

databaase.db를 클릭했을 때 다음과 같다면 성공


 

SQLAlchemy로 Database 조작하기

 

- Database에 데이터 넣기

Flask shell 켜져있는 지 확인 후

song = Song(username="추천자", title="노래제목", 
            artist="가수", image_url="이미지 주소")
db.session.add(song)
db.session.commit()

add: DB에 올림

commit: DB에 저장

데이터 베이스 파일로 확인 가능

 

- Database에 있는 모든 데이터를 조회하기

데이터 표시 형식은 우리가 class Song에서 설정해둔 대로 나오게 된다.

 

테이블이름.query.all() 실행

>>> Song.query.all()


 

Database에서 가져온 데이터 리스트 형식으로 사용

>>> song_list = Song.query.all()
>>> song_list[0] # 가수:노래제목 추천 by 추천자

테이블명.query.all() : DB의 모든 데이터가 리스트 형식으로 (넣어주는 변수에) 들어감

넣어준 리스트[0] : 첫번째로 넣은 데이터가 나옴

 

딕셔너리를 사용하는 것처럼 속성 값을 통해 원하는 데이터를 가져올 수 있음

>>> song_list[0].title # 노래 제목

 

특정 조건으로 데이터 가져오기

Song.query.filter_by(username='추천자').all()
# [가수:노래제목 추천 by 추천자, 가수1:노래제목1 추천 by 추천자]

테이블명.query.filter_by(필드명='조건값').all() 로 조건에 맞는 데이터를 전부 가져온다.

 

원하는 데이터를 1개 가져오려면 .first() 사용

Song.query.filter_by(id=3).first() # 가수2:노래제목2 추천 by 스파르타
Song.query.filter_by(title='노래제목').first() # 가수:노래제목 추천 by 추천자

 

데이터 수정

song_data = Song.query.filter_by(id=4).first()
song_data.title = '변경된제목'

db.session.add(song_data)
db.session.commit()

 

수정 후 꼭 add()db.session.commit() 해주기!!

 

데이터 삭제

delete_data = Song.query.filter_by(id=4).first()
db.session.delete(delete_data)
db.session.commit()

수정과 마찬가지로 db.session.commit()를 해줘야 반영됨.


 

# 데이터를 DB에 저장하기
song = Song(username="추천자", title="노래제목", 
            artist="가수", image_url="이미지 주소")
db.session.add(song)
db.session.commit()

# 모든 데이터 조회하기
song_list = Song.query.all()

# 데이터 1개 가져오기
Song.query.filter_by(id=3).first()

# 데이터 변경하기 
song_data = Song.query.filter_by(id=4).first()
song_data.title = '변경된제목'
db.session.add(song_data)
db.session.commit()

# 데이터 삭제하기
delete_data = Song.query.filter_by(id=4).first()
db.session.delete(delete_data)
db.session.commit()

 


파이썬 으로 db 연동 재밌다!!

자바보다 훨씬 간단해서 너무 좋다.

진도가 빨라서 좋음! 처음했으면 어땠을 지 모르겠는데

강의진도가 나에게 딱 맞는 속도라 좋다.