공부/Python
CheckConstraint를 사용하여 SQLAlchemy 문자열 형식 제한하기
빛나는나무
2024. 1. 19. 23:46
SQLAlchemy에서 column의 데이터에 대한 특정한 형식을 강제하려면, CheckConstraint나 server_default와 같은 방법을 사용하여 데이터의 유효성을 검증하고, 필요에 따라 변환을 수행할 수 있습니다.
예를 들어, CheckConstraint를 사용하여 정규 표현식을 이용해 유효성을 검증하는 방법은 다음과 같습니다.
from sqlalchemy import Column, String, create_engine, CheckConstraint
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class MyTable(Base):
__tablename__ = 'my_table'
user_id = Column(String(36), nullable=False, server_default='', comment="User ID")
# 유효성 검증을 위한 정규 표현식
__table_args__ = (
CheckConstraint("user_id ~ '^[a-f0-9-]{36}$'", name='valid_user_id_format'),
)
# SQLite 메모리 데이터베이스를 사용하도록 설정
engine = create_engine('sqlite:///:memory:')
# 테이블 생성
Base.metadata.create_all(engine)
# 세션 생성
Session = sessionmaker(bind=engine)
session = Session()
# 실패하는 경우
new_data = MyTable(user_id='invalid_format')
session.add(new_data)
try:
session.commit()
except Exception as e:
print(f"Error: {e}")
session.rollback()
# 성공하는 경우
new_data = MyTable(user_id='valid-format-12345')
session.add(new_data)
session.commit()
# 검증된 데이터베이스 확인
result = session.query(MyTable).first()
print(result.user_id)
이 예에서는 CheckConstraint를 사용하여 user_id 값이 특정한 정규 표현식에 맞는지 확인합니다. server_default는 이 필드에 값을 할당할 때 기본값을 설정하는 데 사용됩니다.
이렇게 함으로써 특정한 형식의 문자열이 저장되도록 할 수 있습니다. 다만, 이러한 방식은 데이터베이스 엔진에 따라 지원 여부가 다를 수 있습니다. 특히, SQLite의 경우 정규 표현식을 지원하지 않을 수 있습니다. 경우에 따라서는 애플리케이션 레벨에서 데이터의 유효성을 체크해야 할 수 있습니다.