SQLAlchemy에서 기본값 설정하기
default 속성 사용하기
default
속성은 열에 대한 기본값을 지정하는 데 사용됩니다. 기본값은 Python 표현식이나 SQL 표현식일 수 있습니다.
from sqlalchemy import Column, Integer, String, create_engine
engine = create_engine('sqlite:///database.db')
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(255), default='John Doe')
email = Column(String(255), default=lambda: f'{name}@example.com')
Base.metadata.create_all(engine)
위 예제에서:
name
열의 기본값은 'John Doe'입니다.email
열의 기본값은 사용자 이름을 기반으로 하는 람다 함수입니다.
server_default 속성 사용하기
server_default
속성은 데이터베이스 서버에서 설정하는 기본값을 지정하는 데 사용됩니다. 이 속성은 Python 표현식을 사용할 수 없으며 SQL 표현식만 사용할 수 있습니다.
from sqlalchemy import Column, Integer, String, create_engine
engine = create_engine('sqlite:///database.db')
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(255), server_default='John Doe')
email = Column(String(255), server_default=lambda: f'CURRENT_TIMESTAMP')
Base.metadata.create_all(engine)
name
열의 기본값은 데이터베이스 서버에서 'John Doe'로 설정됩니다.email
열의 기본값은 데이터베이스 서버에서 현재 시간으로 설정됩니다.
주의 사항:
default
속성과server_default
속성을 함께 사용할 수 없습니다. 둘 중 하나만 사용해야 합니다.server_default
속성을 사용하려면 데이터베이스 서버가 해당 기능을 지원해야 합니다.
예제 코드: 기본값 사용하기
from sqlalchemy import Column, Integer, String, create_engine
# 데이터베이스 연결 엔진 생성
engine = create_engine('sqlite:///database.db')
# 사용자 테이블 정의
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(255), default='John Doe') # 기본값으로 'John Doe' 설정
email = Column(String(255), default=lambda: f'{name}@example.com') # 사용자 이름 기반 람다 함수 사용
active = Column(Boolean, default=True) # 기본값으로 True 설정
# 테이블 생성
Base.metadata.create_all(engine)
# 사용자 추가
user = User()
user.name = 'Jane Doe'
user.email = '[email protected]'
# 세션에 사용자 추가 및 커밋
session.add(user)
session.commit()
# 사용자 가져오기
user = session.query(User).filter(User.name == 'Jane Doe').first()
# 사용자 정보 출력
print(f"사용자 이름: {user.name}")
print(f"사용자 이메일: {user.email}")
print(f"사용자 활성화 여부: {user.active}")
이 코드는 다음과 같은 작업을 수행합니다.
sqlite:///database.db
라는 이름의 SQLite 데이터베이스에 연결하는 엔진을 만듭니다.users
라는 이름의 테이블을 정의합니다. 이 테이블에는id
,name
,email
,active
라는 네 개의 열이 있습니다.active
열의 기본값을 True로 설정합니다.users
테이블을 생성합니다.- 'Jane Doe'라는 이름의 새 사용자를 만듭니다.
- 사용자의 이름을 'Jane Doe'이고 이메일을 '[email protected]'으로 설정합니다.
- 사용자를 세션에 추가하고 커밋합니다.
- 이름이 'Jane Doe'인 사용자를 가져옵니다.
- 사용자의 이름, 이메일 및 활성화 상태를 출력합니다.
대체 방법: 데이터베이스 트리거 사용하기
CREATE TRIGGER set_default_values
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
IF NEW.name IS NULL THEN
SET NEW.name = 'John Doe';
END IF;
IF NEW.email IS NULL THEN
SET NEW.email = CONCAT(NEW.name, '@example.com');
END IF;
END;
set_default_values
라는 트리거가users
테이블에 정의됩니다.- 이 트리거는 새 레코드가 삽입되기 전에 실행됩니다.
name
열이 NULL이면John Doe
로 설정됩니다.email
열이 NULL이면 사용자 이름을 기반으로@example.com
을 추가하여 설정됩니다.
장단점 비교
방법 | 장점 | 단점 |
---|---|---|
default 속성 사용 | 간단하고 사용하기 쉬움 | 데이터베이스 서버가 모든 기본값 유형을 지원하지 않을 수 있음 |
server_default 속성 사용 | 데이터베이스 서버에서 기본값을 설정할 수 있음 | 모든 데이터베이스 서버가 server_default 속성을 지원하지 않음 |
데이터베이스 트리거 사용 | 더 많은 제어력을 제공 | 복잡하고 관리하기 어려울 수 있음 |
결론
python sqlalchemy