상세 컨텐츠

본문 제목

[FastAPI] CRUD 구현 (models.py 중심) #4

FastAPI

by grizzly 2025. 4. 11. 12:04

본문

앞서 나온 schemas.py가 API 요청 / 응답을 위하여 데이터 구조를 정의했다면, 이 파일은 DB 테이블 구조를 정의한다.

from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, DateTime, Text
from sqlalchemy.orm import relationship
from datetime import datetime

from database import Base


class Patient(Base):
    __tablename__ = "patients"

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    birth_date = Column(DateTime)
    gender = Column(String)
    contact = Column(String)
    address = Column(String)
    is_active = Column(Boolean, default = True)
    created_at = Column(DateTime, default=datetime.now)
    updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)

    examinations = relationship("Examination", back_populates="patient")
    treatments = relationship("Treatment", back_populates="patient")

이와 같다.

다른 것보다 from database import Base의 경우,

database.py에서 정의된 SQLAlchemy의 기본 클래스이다.

해당 부분을 모든 모델이 상속받게 된다.

database.py의 base의 경우 다음과 같다.

SQLALCHEMY_DATABASE_URL = "sqlite:///./healthcare.db"

engine = create_engine(
    SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

이제 세부 코드르 살펴보면,

class Patient(Base):
    __tablename__ = "patients"
    
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    birth_date = Column(DateTime)
    gender = Column(String)
    contact = Column(String)
    address = Column(String)
    is_active = Column(Boolean, default=True)
    created_at = Column(DateTime, default=datetime.now)
    updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
    
    examinations = relationship("Examination", back_populates="patient")
    treatments = relationship("Treatment", back_populates="patient")
  • __tablename__ = "patients" : 테이블 이름을 patients로 지정
  • id
    • primary_key = True : 이 컬럼을 테이블의 기본키로 지정
    • index=True : 이 컬럼에 인덱스를 생성하여 검색 성능 향상 시킴
  • name
    • index=True : 이름 필드에도 인덱스 생성(자주 검색되는 것으로 예상되어지는 부분에 생성)
  • @@@ 여러 기본 컬럼
  • is_active
    • default=True : 새 환자 레코드 생성 시 기본 값으로 True 설정
    • 해당 필드는 실제로 삭제하는 것이 아닌 비활성화하는 패턴에서 자주 사용됨
  • create_at
    • default=datetime.now : 레코드 생성 시 현재 시간이 자동 설정
  • update_at
    • default=datetime.now : 초기 생성 시의 기본 값
    • onupdate=datetime.now : 레코드가 업데이트될 때마다 현재 시간으로 자동 업데이트

관계 관련

examinations = relationship("Examination", back_populates="patient")
treatments = relationship("Treatment", back_populates="patient")
  • relationship : SQLAlchemy에서 테이블 간의 관계를 정의함
  • "Examination", "Treatment" : 관계가 맺어질 다른 모델 클래스의 이름
  • back_populates = "patient" : 상대 모델에서 이 모델을 참조하는 속성 이름
  • 한 환자는 여러 검사와 치료를 받을 수 있다라는 일대다 관계를 정의

back_populates 속성은 양방향 관계를 설정함.

  • patient.examinations : 환자의 모든 검사에 접근 가능
  • examination.patient : 검사를 받은 환자에 접근 가능

여기까지로 main.py와 schemas.py, database.py, models.py의 구조와 간단한 기본적 구현에 대해서 알아봤다.

 

 

 

 

 

 

 

 

관련글 더보기