안녕하세요! 오늘은 닉네임을 생성하고 데이터베이스에 넣어보는 거를 해보겠습니다.
먼저 데이터베이스를 연결해주어야 하는데요.(MySQL을 사용하는 전제입니다.)
database.py
from sqlalchemy import create_engine, text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
DATABASE_URL = "mysql://{}:{}@{}:{}/{}?charset=utf8mb4".format("[mysql_id]", "[mysql_pw]","127.0.0.1",3306,"[database_name]")
# 엔진생성
engine = create_engine(
DATABASE_URL
)
# 세션생성
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# base 객체생성
Base = declarative_base()
# 데이터베이스 연결을 시도하고 간단한 쿼리를 실행합니다.
try:
# 세션 생성
Session = sessionmaker(bind=engine)
session = Session()
# 간단한 쿼리 실행, 예를 들어 현재 타임스탬프를 선택합니다.
result = session.execute(text("SELECT NOW()"))
current_time = result.scalar()
print("데이터베이스 연결이 성공했습니다. 현재 시간:", current_time)
except Exception as e:
print("데이터베이스 연결에 실패했습니다. 오류:", e)
finally:
# 세션을 닫습니다.
session.close()
해당 폴더를 실행하면 데이터베이스가 연결 되었다는 문구를 터미널에서 확인해 볼 수 있습니다.
이제 테이블을 작성하고 서버를 실행하면 자동으로 테이블이 생성되게 해보겠습니다.
model.py
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, Date, DateTime,text
from sqlalchemy.orm import relationship
from .database import Base, engine
from sqlalchemy.sql import func
# User 테이블
class User(Base):
__tablename__ = "user"
nickname = Column(String(255), nullable=False, primary_key=True)
# 수면 정보 테이블
class SleepInfo(Base):
__tablename__ = "sleep_info"
sleep_info_id = Column(Integer, autoincrement=True, primary_key=True)
nickname = Column(String(255), ForeignKey("user.nickname"), nullable=False)
date = Column(Date, default=func.now())
total_sleep = Column(String(255))
start_sleep = Column(String(255))
end_sleep = Column(String(255))
# 수면 이벤트 테이블
class SleepEvent(Base):
__tablename__ = "sleep_event"
sleep_event_id = Column(Integer, autoincrement=True, primary_key=True)
sleep_info_id = Column(Integer, ForeignKey("sleep_info.sleep_info_id"), nullable=False)
sleep_event = Column(String(255), nullable=True)
event_time = Column(String(255))
event_data_path = Column(String(255))
# 처음 한번만 생성
Base.metadata.create_all(engine)
서버를 실행시키고 확인해 보면 테이블이 생성된 것을 확인해 볼 수 있습니다.
이제 각 테이블의 데이터 형식을 schemas.py에 작성해 줍니다.
from pydantic import BaseModel
class UserBase(BaseModel):
nickname: str
class SleepInfoBase(BaseModel):
nickname: str
start_sleep: str
class SleepInfoUpdate(BaseModel):
end_sleep: str
total_sleep: str
user 생성을 위해 crud.py를 작성합니다.
from sqlalchemy.orm import Session
from sqlalchemy import func
from fastapi_app import model
from fastapi_app import schemas
def create_db_user(db: Session, user: schemas.UserBase):
db_user = model.User(nickname=user.nickname)
db.add(db_user)
db.commit()
db.refresh(db_user)
return db_user
db: Session은 database를 가져오겠다는 것이고,
user: schemas.UserBase는 방금 작성하였던 schemas.py에 아래 클래스 형식을 가져오겠다는 것입니다.
class UserBase(BaseModel):
nickname: str
*데이터베이스의 칼럼명과 꼭 똑같이 적어주어야 합니다.
이제 api_record.py에 유저 저장 함수를 작성하겠습니다.
@router.post("/record/create_user")
async def create_user(user: UserBase, db: Session = Depends(get_db)):
db_user = create_db_user(db, user)
return db_user
home.html도 간단하게 작성해 줍니다.
<!DOCTYPE html>
<html>
<head>
<title>사용자 생성</title>
</head>
<body>
<input name="nickname" id="nickname" placeholder="닉네임을 입력해주세요" />
<button id="capButton">촬영페이지로</button>
<button id="saveButton">저장</button>
<script src="static/js/record.js"></script>
</body>
</html>
버튼 클릭을 했을 때 이벤트 처리를 위한 home.js입니다.
*data key를 꼭 데이터베이스 칼럼명과 똑같이 넣어주어야 합니다.
document.getElementById("saveButton").addEventListener("click", function () {
const nickname = document.getElementById("nickname").value;
// 데이터를 JSON 형식으로 준비
const userData = {
nickname: nickname,
};
// 서버로 데이터를 POST 요청으로 전송
fetch("/record/create_user", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(userData),
})
.then((response) => response.json())
.then((data) => {
// 서버에서 받은 응답을 처리할 수 있습니다.
console.log("서버에서 받은 데이터:", data);
alert("사용자가 생성되었습니다.");
// 사용자가 입력한 닉네임을 사용하여 다른 페이지로 이동
window.location.href = "/record?nickname=" + nickname;
})
.catch((error) => {
console.error("서버 요청 오류:", error);
alert("사용자 생성에 실패했습니다.");
});
});
document.getElementById("capButton").addEventListener("click", function () {
const nickname = document.getElementById("nickname").value;
// 리다이렉트 URL을 생성하여 /record?nickname=에 닉네임을 추가합니다
const redirectURL = "/record?nickname=" + nickname;
// 페이지를 리다이렉트합니다
window.location.href = redirectURL;
});
저장 버튼을 누르면 닉네임이 저장되고 촬영페이지로 이동합니다.
저장된 닉네임을 입력하고 촬영페이지를 클릭하면 촬영페이지로 이동합니다.
test로 정하고 저장버튼을 누르면
사용자가 생성되었다는 메시지가 뜨고 확인을 누르면 촬영페이지로 이동합니다.
database에도 생성한 닉네임이 생성된 것을 확인해 볼 수 있습니다.
다음 개발과정에선
닉네임을 토대로 촬영정보(촬영시작 및 종료 시간, 총 촬영시간)를 데이터베이스에 넣어보겠습니다.
'과정 > 2차 AI프로젝트 서비스 개발' 카테고리의 다른 글
프로젝트 '재움' 개발과정(5) (0) | 2023.11.07 |
---|---|
프로젝트 '재움' 개발과정(4) (0) | 2023.10.31 |
프로젝트 '재움' 개발과정(3) (0) | 2023.10.23 |
프로젝트 '재움' 개발과정(1) (1) | 2023.10.19 |
댓글