[FastAPI] SQLModel의 default와 default_factory의 차이
1. erver_default와 default의 주요 차이점
1) default :
- default는 SQLAlchemy 모델에서 Python 코드 상에서 객체가 생성될 때 사용되는 기본 값을 설정한다.
- 새로운 데이터가 생성될 때 해당 컬럼에 기본 값을 설정한다.
- Python 함수나 값으로 설정할 수 있으며, 예를 들어 default=datetime.utcnow()과 같이 사용할 수 있다.
- default로 설정된 값은 데이터베이스의 INSERT 문 실행 시에만 적용된다.
2) server_default :
- server_default는 데이터베이스 레벨에서 기본 값을 설정하는 방식이다.
- 데이터베이스의 스키마 정의에서 SQL 함수나 표현식을 사용하여 기본 값을 설정한다.
- 기존 데이터에도 적용될 수 있으며, 데이터베이스에서 해당 기본 값을 사용하여 컬럼을 생성한다.
- 예를 들어, server_default=func.now()과 같이 사용할 수 있다.
- server_default를 사용하면 데이터베이스의 스키마 변경 시에도 기존 데이터에 자동으로 기본 값을 적용할 수 있다.
- 따라서 데이터베이스 스키마를 변경할 때 기존 데이터에도 적용되어야 하는 경우에는 server_default를 사용하는 것이 적합하다.
- default는 주로 Python 코드에서 객체를 생성할 때만 적용되며, 새로운 데이터에만 기본 값을 설정할 때 사용된다.
2. default와 server_default를 각각 사용하는 SQLAlchemy 모델의 예제 코드
1) default 사용 예제
- reated_at 컬럼은 객체가 생성될 때의 현재 시간으로 기본 값을 설정하도록 default=func.now()로 정의되어 있다.
- 이 경우, 데이터베이스에 새로운 사용자가 추가될 때 해당 컬럼에는 그 때의 시간이 자동으로 기록된다.
from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql import func
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
created_at = Column(DateTime, default=func.now())
# 예시 사용
new_user = User(name='John Doe')
print(new_user.created_at) # 실행 시점의 현재 시간이 출력됨
2) server_default 사용 예제
- created_at 컬럼은 데이터베이스 서버의 now() 함수를 사용하여 기본 값을 설정하도록 server_default=text('now()')로 정의되어 있다.
- 이 설정은 데이터베이스가 해당 컬럼의 기본 값을 설정하도록 하며, 데이터가 실제로 삽입될 때 데이터베이스가 시간을 기록하게 된다.
from sqlalchemy import Column, Integer, String, DateTime, text
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
created_at = Column(DateTime, server_default=text('now()'))
# 예시 사용
new_user = User(name='Jane Doe')
# SQLAlchemy ORM에서 데이터베이스에 추가하기 전까지는 서버의 기본값이 반영되지 않음
- reference :
https://it-is-my-life.tistory.com/30
'Study > fastapi' 카테고리의 다른 글
tenacity를 이용한 retry 사용 방법 정리 (0) | 2025.02.04 |
---|---|
pydantic의 orm_model=true, 가상필드, validator 정리 (0) | 2025.01.31 |
FastAPI에서 settings 사용하는 방법 - pydantic-settings (0) | 2025.01.30 |
[udemy] Complete FastAPI masterclass from scratch 학습 평가 (0) | 2025.01.30 |
[udemy] Complete FastAPI masterclass from scratch - 학습 정리 2 (0) | 2025.01.30 |
댓글