본문 바로가기

Study/BackEnd

[FastAPI] SQLModel에서 default와 default_factory 옵션의 차이점

sqlmodel을 이용해서 데이터베이스 모델을 구현하고 있었는데,
날짜 값이 입력되지 않을 경우에 datetime 함수를 실행해서 자동으로 날짜를 채우도록 필드에 default 옵션을 줬는데도 불구하고 날짜가 업데이트 되지 않고 어느 한 날짜로 계속 고정이 되어 있는 문제가 발생했다.

문제는 바로 이 default 옵션에 있었다.

 내 코드 중 문제가 되는 부분으로 살펴보자.

 

class Conversation(SQLModel, table = True):
    nickname: str = Field(foreign_key = User.nickname)
    conversation_id: str = Field(default = None, primary_key = True)
    day: Optional[int] = Field(default = date.today().day, nullable = False)

 

default 옵션은 값이 없는 경우, 미리 정의한 값으로 정적인 채우기를 수행하는 옵션이기 때문에
해당 코드가 실행되는 시점, 그러니까 테이블이 생성되는 시점의 datetime 함수 값으로 날짜가 고정되어 버린 것이다.

이를 해결하기 위해서는 default_factory 옵션을 이용해주어야 한다.

default_factory 옵션은 동적 호출이기 때문에 값이 없는 경우, 정의한 함수를 해당 시점에서 동적으로 호출하여 값을 채운다.

 

class Conversation(SQLModel, table = True):
    nickname: str = Field(foreign_key = User.nickname)
    conversation_id: str = Field(default = None, primary_key = True)
    day: Optional[int] = Field(default_factory = date.today().day, nullable = False)

 

이렇게 default_factory 옵션을 이용하면, 값이 업데이트 되는 시점에서 datetime 함수가 실행되기 때문에
정상적으로 날짜가 입력되는 것을 확인할 수 있다.