강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

김도현님의 프로필 이미지
김도현

작성한 질문수

[매일 완독 챌린지] 저자와 함께하는 <FastAPI로 기획에서 출시까지>

8.5절 : 캘린더 예약 가져오기 API 구현하기 (p321~p338)

4주 3회차 과제

해결된 질문

작성

·

18

·

수정됨

0

데이터베이스 고윳값 제약으로 예방하는 구현에 대해서 조사했습니다.

 

  1. 동일 일자와 동일 타임슬롯인 경우 중복

Booking에 unique index를 생성하는 것인데 동일 일자 (when)과 동일 타임슬롯(time_slot_id) 조건을 생성하면 됩니다.

 

CREATE UNIQUE INDEX uq_booking_slot ON bookings (when, time_slot_id);
class Booking(SQLModel, table=True):
    __tablename__ = "bookings"
    __table_args__ = (
        UniqueConstraint("when", "time_slot_id", name="uq_booking_slot"),
    )

 

  1. attendance_status 필드값이 cancelled인 경우

PostgreSQL의 경우 partial unique index가 가능합니다. where를 사용해서 field가 cancelled가 아닌 경우에 unique 제약을 걸면 됩니다.

 

CREATE UNIQUE INDEX uq_booking_slot ON bookings (when, time_slot_id) WHERE attendance_status <> 'cancelled' ;
class Booking(SQLModel, table=True):
    __tablename__ = "bookings"
    __table_args__ = (
        UniqueConstraint("when", "time_slot_id", name="uq_booking_slot"), postgresql_where=text("attendance_status <> 'cancelled'")
    )

 

다중 컬럼에 대한 unique는 종종 사용하는 방법이었는데 where를 이용해서 조건을 설정할 수 있는 건 이번에 첨 알았습니다. 필요하면 python에서 처리하곤 했었는데 데이터베이스 기능으로 이용하는게 레이스 컨디션도 피할 수 있고 장점이 있어보이네요.

 

실무에 적용할때도 꼭 이용해보겠습니다.

답변 1

0

한날님의 프로필 이미지
한날
지식공유자

정석으로 잘 구현하셨어요. 👍

SQLite에서는 동작하지 않는 방식이고, 실 서비스에서 여러 사용자가 접근하는 용도로 SQLite를 사용하지는 않지만, SQLite에서 고윳값 제약을 조건부로 적용하는 효과를 보는 방법도 한 번 고민해보세요. 가령, 버저닝(versioning)을 한다면, SQLite에서도 비슷한 효과를 볼 수 있는데, SQLite를 위해서가 아니더라도 버저닝을 활용하는 정책이나 기능이 필요하다면 고려해볼 수 있지요.

김도현님의 프로필 이미지
김도현

작성한 질문수

질문하기