4주 3회차 과제
데이터베이스 고윳값 제약으로 예방하는 구현에 대해서 조사했습니다.
동일 일자와 동일 타임슬롯인 경우 중복
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"),
)
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에서 처리하곤 했었는데 데이터베이스 기능으로 이용하는게 레이스 컨디션도 피할 수 있고 장점이 있어보이네요.
실무에 적용할때도 꼭 이용해보겠습니다.
Answer 1
0
정석으로 잘 구현하셨어요. 👍
SQLite에서는 동작하지 않는 방식이고, 실 서비스에서 여러 사용자가 접근하는 용도로 SQLite를 사용하지는 않지만, SQLite에서 고윳값 제약을 조건부로 적용하는 효과를 보는 방법도 한 번 고민해보세요. 가령, 버저닝(versioning)을 한다면, SQLite에서도 비슷한 효과를 볼 수 있는데, SQLite를 위해서가 아니더라도 버저닝을 활용하는 정책이나 기능이 필요하다면 고려해볼 수 있지요.
4주 1회차 과제
0
44
2
4주 5회차 과제
0
44
1
4주 5회차 과제 제출
0
52
2
4주 4회차 과제 제출
0
62
2
351쪽 질문
0
52
2
4주 3회차 과제
0
49
2
refresh() 메서드와 픽스처에 대해 질문이 있습니다.
0
59
2
4주 2회차 과제 질문
0
57
3
4주 1회차 과제
0
53
2
4주 1회차 과제
0
44
2
4주 3회차 과제
0
55
2
4주 1회차 과제
0
52
2
4주 5회차 과제
0
38
2
4주 1회차 과제
0
30
2
4주 1회차 과제
0
25
2
4주 4회차 과제 제출
0
36
2
4주 1회차 과제 제출합니다.
0
43
1
4주 2회차 과제
0
49
1
patch 요청시 payload가 넘어가지 않습니다.
0
60
3
4주 1회차 과제
3
119
2
페이지 144 코드 문의
0
61
3
책과 github 코드가 다릅니다 p130
0
50
2
120페이지 코드 질문드립니다.
0
48
2
테스팅과 학습법의 관계 (?)
0
67
2

