__table_args__ 메소드 정리
1. __table_args__란?
- __table_args__는 SQLAlchemy 모델 클래스 내에서 테이블에 대한 다양한 설정을 정의하는 데 사용되는 특별한 클래스 속성이다. 이 속성을 사용하여 테이블 수준의 설정을 지정할 수 있다.
2. 사용 방법과 기능
- __table_args__는 다음과 같이 설정할 수 있다.
class MyModel(Base):
__tablename__ = 'my_table'
__table_args__ = (
# 여기에 테이블 옵션을 지정합니다.
{'schema': 'public'}, # 스키마 설정 예시
{'comment': 'This is a table for storing XYZ data.'} # 주석 설정 예시
)
id = Column(Integer, primary_key=True)
name = Column(String)
3. 특징과 적용 범위
- Database 반영 여부:
- __table_args__에 지정된 설정은 데이터베이스에 반영된다.
- 예를 들어, 스키마 설정과 같은 것들이 실제 데이터베이스의 테이블 생성 시 반영된다.
- 어플리케이션 적용 범위:
- __table_args__는 테이블과 관련된 SQLAlchemy ORM 모델 클래스 내에서만 적용된다.
- 다시 말해, 이 설정들은 해당 모델을 사용하는 어플리케이션의 범위 내에서만 적용된다.
- 특정 메소드 적용 여부:
- __table_args__는 특정 메소드에 적용되는 것이 아니라, 단순히 테이블 자체의 설정을 지정하는 용도로 사용된다.
- 따라서 모델 클래스의 전체 범위에 걸쳐 적용된다.
4. __table_args__ 메소드 정리
1) UniqueConstraint
- 하나 또는 여러 컬럼의 조합이 유니크해야 함을 정의
- name 파라미터로 제약조건의 이름을 지정 가능
- 복합 유니크 키를 생성할 때 주로 사용
from sqlalchemy import UniqueConstraint
__table_args__ = (
UniqueConstraint('column1', 'column2', name='unique_col1_col2'),
)
2) Index
- 데이터베이스 검색 성능 향상을 위한 인덱스 생성
- 여러 컬럼을 조합한 복합 인덱스 생성 가능
- unique=True 옵션으로 유니크 인덱스 생성 가능
- postgresql_using='btree'와 같이 인덱스 타입 지정 가능
from sqlalchemy import Index
__table_args__ = (
Index('idx_name', 'column1', 'column2'),
)
3) ForeignKeyConstraint
- 여러 컬럼을 참조하는 복합 외래키 설정
- onupdate와 ondelete 옵션으로 참조 동작 정의 가능
- deferrable=True로 제약조건 지연 가능
from sqlalchemy import ForeignKeyConstraint
__table_args__ = (
ForeignKeyConstraint(
['local_col1', 'local_col2'],
['foreign_table.col1', 'foreign_table.col2'],
name='fk_name'
),
)
4) CheckConstraint
- 컬럼 값에 대한 조건 검사 규칙 정의
- SQL 표현식을 사용하여 복잡한 조건 설정 가능
- 데이터 무결성 보장을 위해 사용
from sqlalchemy import CheckConstraint
__table_args__ = (
CheckConstraint('price > 0', name='check_positive_price'),
)
5) PrimaryKeyConstraint
- 복합 기본키 설정
- 여러 컬럼을 조합하여 기본키 생성
- autoincrement=True 옵션으로 자동 증가 설정 가능
from sqlalchemy import PrimaryKeyConstraint
__table_args__ = (
PrimaryKeyConstraint('col1', 'col2', name='pk_name'),
)
6) 테이블 옵션 설정
- 테이블의 특정 데이터베이스 엔진 옵션 설정
- 문자셋, 콜레이션 등의 테이블 속성 정의
- 스키마 지정 가능
__table_args__ = {
'mysql_engine': 'InnoDB',
'mysql_charset': 'utf8mb4',
'schema': 'custom_schema'
}
7) 복합 설정
- 여러 제약조건과 테이블 옵션을 동시에 설정
- 튜플 형태로 여러 제약조건을 나열하고, 마지막에 딕셔너리로 테이블 옵션 지정
- 각 제약조건은 독립적으로 동작
__table_args__ = (
UniqueConstraint('col1', 'col2', name='unique_cols'),
Index('idx_col3', 'col3'),
{'mysql_engine': 'InnoDB'}
)
8) 커멘트(Comment) 추가
- comment 파라미터로 테이블 또는 컬럼의 설명을 추가해 데이터베이스 문서화에 활용한다.
class User(Base):
__tablename__ = "users"
__table_args__ = {'comment': '사용자 정보 테이블'}
id = Column(Integer, primary_key=True, comment='사용자 고유 ID')
8) 주의사항
- __table_args__는 튜플이나 딕셔너리 형태로만 설정 가능
- 여러 제약조건을 설정할 때는 반드시 튜플 형태로 작성
- 테이블 옵션만 설정할 경우 딕셔너리 형태로 작성
- 제약조건의 이름은 데이터베이스 내에서 유니크해야 함
- 일부 옵션은 특정 데이터베이스에서만 지원될 수 있음
'SQLAlchemy' 카테고리의 다른 글
Mapped와 DynamicMapped의 정리 - 1:1, 1:n, n:m & uselist 포함 (0) | 2025.02.17 |
---|---|
sqlalchemy의 declarative_base()를 fastapi에서 사용하는 이유 (0) | 2025.02.08 |
[SQLALchemy] 트랜잭션(Transaction) 그리고 Database Lock (0) | 2025.02.04 |
[SQLALchemy] 비동기 함수, 비동기 Database 그리고 Pool의 정리 (0) | 2025.02.01 |
[SQLALchemy] 세션(Session), 비동기 세션(Async Session) 그리고 scoped_session의 정리 (0) | 2025.02.01 |
댓글