-
ORM | ODM +Mongo DB 특징대학 수업/Fast API 2024. 11. 19. 13:20
@router.put('/{id}', response_model = EventPublic) async def update_event( id : int, event : EventUpdate, user: User = Depends(authenticate), session : Session = Depends(get_session)) : for db_event in user.events: if event.id == id: user.event.remove(event) # 객체의 (연결된)속성을 수정하면 relation에 반영되지 않는다 - 원본에서 바뀐게 없으니까 event_data = event.model_dump(exclude_unset=True) # 객체에 어떤 Operation을 사용할 떄 테이블에 어떻게 작용할 것인가? db_event.sqlmodel_update(event_data) user.events.append(db_event) session.add(user) # session.commit() return db_event raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Event with supplied id is not found" )
그렇다면, 적용하기 위해서는, 아예 relation전체를 지우고, 다시 내용을 올리면, User의 내용이 바뀐것과 동일하게 취급하여 반영될 수 있다.
- delete cascading :
- db driver : sql Alchemy(lapping 대상) 수준에서 지원하기
- db 에 속성 설정하기(On depend)
class User(UserBase, table =True) : id : Optional[int] = Field(default = None, primary_key= True) hashed_password : str = Field(min_length=4 , max_length=25) # 상호참조중이기에 문제가 된다 // 한쪽을 문자열로 주면 type annotation을 통해 알아서 지정해준다? events : List["Event"] = Relationship(back_populates='user', cascade_delete=True)
class Event(EventBase, table = True) : id : Optional[int] = Field(default = None, primary_key= True) user_id : int = Field(foreign_key="user.id", ondelete="CASCADE") #DB관련 정보 user : User = Relationship(back_populates='events')
No only SQL : SQL을 사용하지 않고 db 작업 함
- 수평확장 가능 분산 시스템
- Schema-less
- 완화된 ACID transaction조건put('/{id}', response_model = EventPublic)
- 원자성
- 일관성
- 고립성
- 지속성
- BASE(Basically Available, Soft state, Eventual consistency)
- 기본적으로 사용 가능
- 가용성 필요
- 소프트 상태
- 외부 개입 없이도 정보 변경 가능
- 네트워크 파티션 문제 등으로 인한 일관성 문제 발생 시, 데이터 자동 수정
- 최종 일관성
- 일시적으로 일관성이 깨지더라도 일정 시간 뒤엔 일관성 유지
- 기본적으로 사용 가능
- => 빠른성능과 수평확장을 요구하는 데이터 베이스 시스템 요구
- ==>이러한 요구사항을 충족 위한 데이터 무결성 희생, BASE트랜젝션 처리 수행
Binary Json : Bson
객체가 저장된 Docu : 의 저장하기 좋은 Json : 을 Binary
저장 대상 데이터 + Key값 필드추가(ObjectId)
- 자동생성 + Unique값 : timestamp, RandomValue(3:이더넷 주소+2:),Count
- Primarykey : DBMS의 자동부여 | ObjectId 는 클라이언트 생성
파이썬 라이브러리 : Motor? , collection 수준 조작 + Document수준에서도 작업 가능 API
ODM : Object Document Management ODM / ORM 비교 필요
- delete cascading :