Skt 그리닷 project To Do List 01/17

이성원·2024년 1월 18일
0

오늘 작업
ER 다이어그램 설계
데이터베이스 설계, 리팩토링

db 설계

ER 다이어그램


relationship 부분은 추후에 리팩토링해야한다.

database 리팩토링

초기 database.py 코드는 하나의 파일로 되어있어 효율과 가독성이 떨어져서 리팩토링의 필요성을 느꼈다.

model.py, enums.py, database.py config.py 4개 파일로 나눴다.

model.py

from sqlalchemy import Column, Integer, String, Date, Enum, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from .enums import RoleEnum, StatusEnum, GradeEnum, LogTypeEnum

Base = declarative_base()

class Member(Base):
    __tablename__ = 'member'

    id = Column('member_id', Integer, primary_key=True, autoincrement=True)
    email = Column(String(255), nullable=False)
    nickname = Column(String(255), nullable=False)
    password = Column(String(255), nullable=False)
    role = Column(Enum(RoleEnum), nullable=False)
    status = Column(Enum(StatusEnum), nullable=False)
    grade = Column(Enum(GradeEnum), nullable=False)
    register_at = Column(Date, nullable=False)

    gree = relationship("Gree", back_populates="member")
    logs = relationship("Logs", back_populates="member")

class Gree(Base):
    __tablename__ = 'gree'

    id = Column('gree_id', Integer, primary_key=True, autoincrement=True)
    member_id = Column(Integer, ForeignKey('member.member_id'), nullable=False)
    gree_name = Column(String(255), nullable=False)
    root_path = Column(String(255), nullable=False)
    prompt_character = Column(String(255))  # 대체될 수 있습니다
    prompt_age = Column(Integer)
    prompt_mbti = Column(String(255))  # 대체될 수 있습니다
    register_at = Column(Date, nullable=False)

    member = relationship("Member", back_populates="gree")
    logs = relationship("Logs", back_populates="gree")

class Logs(Base):
    __tablename__ = 'logs'

    id = Column('log_id', Integer, primary_key=True, autoincrement=True)
    gree_id = Column(Integer, ForeignKey('gree.gree_id'), nullable=False)
    member_id = Column(Integer, ForeignKey('member.member_id'), nullable=False)
    log_type = Column(Enum(LogTypeEnum), nullable=False)
    talk = Column(String(255))
    register_at = Column(Date, nullable=False)

    member = relationship("Member", back_populates="logs")
    gree = relationship("Gree", back_populates="logs")

기본적인 table의 entity(개체), attribute(속성), relation(관계)를 정의한다.

enums.py

from enum import unique, Enum as PyEnum

@unique
class RoleEnum(PyEnum):
    ADMIN = "ADMIN"
    MANAGER = "MANAGER"
    MEMBER = "MEMBER"

@unique
class StatusEnum(PyEnum):
    ACTIVATE = "ACTIVATE"
    DISABLED = "DISABLED"

@unique
class GradeEnum(PyEnum):
    FREE = "FREE"
    BASIC = "BASIC"
    PREMIUM = "PREMIUM"

@unique
class LogTypeEnum(PyEnum):
    SENDTALK = "SENDTALK"
    RECEIVEDTALK = "RECEIVEDTALK"
    CLICKED = "CLICKED"

enums.py는 테이블에 Enum type 모아놓은 파일이다.

database.py

from sqlalchemy import create_engine
from models import Base

# 데이터베이스 설정
SERVER_HOST = "database-1.c3mqckcawht2.ap-southeast-2.rds.amazonaws.com"
USERNAME = "admin"
PASSWORD = db비밀번호는 비밀
DATABASE_NAME = "greedot"

# SQLAlchemy 엔진 생성
engine = create_engine(f"mysql+pymysql://{USERNAME}:{PASSWORD}@{SERVER_HOST}/{DATABASE_NAME}")

# 데이터베이스에 테이블 생성
Base.metadata.create_all(engine)

database.py는 aws에 올라가있는 db서버에 로그인하고 연동하는 기능을 한다.

config.py

DATABASE_URI = "mysql+pymysql://admin:[db비밀번호]@database-1.c3mqckcawht2.ap-southeast-2.rds.amazonaws.com/greedot"

db에 연결하려면 자주쓰는 url이라 config.py로 따로 빼놨다.

TIL

sqlalchemy 패키지 사용법

from sqlalchemy import Column, Integer, String, Date, Enum, ForeignKey
 #SQLAlchemy의 ORM (Object-Relational Mapping) 기능을 사용할 때 데이터베이스 테이블의 컬럼을 정의하기 위해 사용되는 타입과 클래스를 임포트하는 것

from sqlalchemy.ext.declarative import declarative_base
#SQLAlchemy의 선언적 확장을 사용하여 데이터베이스 테이블과 파이썬 클래스를 연결하는 데 필요한 기반 클래스를 생성하는 데 사용

from sqlalchemy.orm import relationship
#데이터베이스 테이블 간의 관계(릴레이션십)를 정의하는 데 사용

from sqlalchemy import create_engine
#데이터베이스 시스템에 맞는 URL을 인자로 받아, 해당 데이터베이스와의 연결을 위한 엔진 객체를 생성
profile
개발자

0개의 댓글

관련 채용 정보