SQLAlchemy

__table_args__ 메소드 정리

bluebamus 2025. 2. 13.

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__는 튜플이나 딕셔너리 형태로만 설정 가능
      - 여러 제약조건을 설정할 때는 반드시 튜플 형태로 작성
      - 테이블 옵션만 설정할 경우 딕셔너리 형태로 작성
      - 제약조건의 이름은 데이터베이스 내에서 유니크해야 함
      - 일부 옵션은 특정 데이터베이스에서만 지원될 수 있음

댓글