Study/fastapi

[FastAPI] SQLModel의 default와 default_factory의 차이

bluebamus 2025. 2. 3.

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://wikidocs.net/81059

 

3-08 모델 수정하기

* `[완성 소스]` : [github.com/pahkey/jump2flask/tree/3-08](https://github.com/pahkey/jump2flask/tree/3-…

wikidocs.net

https://it-is-my-life.tistory.com/30

 

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

sqlmodel을 이용해서 데이터베이스 모델을 구현하고 있었는데, 날짜 값이 입력되지 않을 경우에 datetime 함수를 실행해서 자동으로 날짜를 채우도록 필드에 default 옵션을 줬는데도 불구하고 날짜가

it-is-my-life.tistory.com

 

댓글