첫 게시물에서 보여드렸던
이 테이블 구조 대로 MySQL에 테이블을 만들어 보겠습니다.
MySQL 설정은 skip 할께요
CREATE TABLE diary (
id varchar(36) NOT NULL PRIMARY KEY,
content varchar(1000),
`date` date NOT NULL,
created datetime DEFAULT CURRENT_TIMESTAMP(),
updated datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP()
);
default charset을 utf8mb4로 설정해놓고
위 SQL을 사용해 table을 생성했습니다.
이제 프로젝트 디렉토리에서
db
폴더 생성 후 안에 model.py
에 ORM에서 사용할 model을 만들어볼게요.
연결을 위해 .env
파일에
user=(user)
pass=(password)
host=(db_host)
port=(db_port)
database=(db_name)
위 형식대로 접속정보를 우선 만들어주었습니다.
ORM으로 sqlalchemy, 엔진으로는 pymsql을 사용하겠습니다
pip install sqlalchemy, pymysql
그리고 model.py
에 아래 내용을 작성했어요.
from sqlalchemy import Column, String, Date, DateTime
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Diary(Base):
__tablename__ = "diary"
id = Column(String(36), primary_key=True)
content = Column(String(1000))
date = Column(Date, nullable=False)
created = Column(DateTime)
updated = Column(DateTime)
그리고 db/db.py
파일에서 세션 접속을 만들어주었습니다.
pip install python-dotenv
python-dotenv
설치 후
import os
from contextlib import contextmanager
from dotenv import load_dotenv
from sqlalchemy import create_engine
from sqlalchemy.orm.session import sessionmaker
load_dotenv(verbose=True)
user = os.getenv("user")
password = os.getenv("pass")
host = os.getenv("host")
port = os.getenv("port")
database = os.getenv("database")
db_url = f"mysql+pymysql://{user}:{password}@{host}:{port}/{database}?charset=utf8"
Session = sessionmaker()
db = create_engine(db_url, encoding="utf-8", pool_recycle=500)
Session.configure(bind=db, expire_on_commit=False)
@contextmanager
def session_scope():
session = Session()
try:
yield session
session.commit()
except:
session.rollback()
raise
finally:
session.close()
contextmanager
를 사용해 with
문으로 session을 사용할 수 있게 만들었어요.
그럼 이제 test용 api를 작성해 보겠습니다.
main.py
에서 전 시간까지 작성했던 테스트용 api를 지우고
아래 내용처럼 작성해보았습니다.
from typing import Optional
from fastapi import FastAPI
from fastapi import Query
from db.db import session_scope
from db.model import Diary
app = FastAPI()
@app.get("/diary")
def get_all_diary():
with session_scope() as session:
diarys = session.query(Diary).all()
return diarys
자 이제 /diary
로 접속했을 때, 모든 data가 응답으로 온다면 성공이겠네요!
그런데.. 지금은 data가 없으니 수동으로 data를 두 개 넣어주었습니다.
이제 실행해볼까요?
uvicorn main:app --reload
그리고 localhost:8000/diary
로 접속해보면?
잘 왔네요! 🥳
그럼 다음 게시물에서는 위 내용을 가지고
db middleware 추가, response_model validation 적용하기를 해 보겠습니다~