[SQLModel] Composite Key 설정

2024. 11. 20. 13:57·개발/파이썬
728x90

데이터 구조

object_id col_name
OBJ00000000000000003 시도
OBJ00000000000000002 시도
OBJ00000000000000100 시도

문제 상황

데이터 조회가 제대로 되지 않음.

for row in session.query(DatalakeType1Columns).all():
            logger.info(f"ID: {row.object_id}, ColName: {row.col_name}")

위 코드에서, 내가 원하는 건 id 3, 2, 100에 대한 데이터를 모두 가져오는 것이었다.
근데 3밖에 안가져와짐

commit 하고 expire_all() 해봐도 마찬가지

근데 DB 에는 제대로 데이터가 모두 들어가 있다.

object_id, col_name 을 복합키로 인식하지 않고 col_name 을 따로 하나의 키로 인식해서 데이터를 합치는 듯 했다.

그래서 명시가 제대로 되지 않은 것으로 판단하여 model 을 변경함

해결법

PrimaryKeyConstraint 를 사용해서 model에서 복합키를 명시적으로 정의해주면 됨.

공식문서
https://docs.sqlalchemy.org/en/20/core/constraints.html#primary-key-constraint

기존 Model

class DatalakeType1Columns(SQLModel, table=True):
    __tablename__ = 'datalake_type1_object_columns'

    object_id: str = Field(default=None, primary_key=True, max_length=50)  # Primary Key (object_id)
    col_name: str = Field(default=None, primary_key=True, max_length=255)  # Primary Key (col_name)
    col_name_eng: Optional[str] = Field(default=None, max_length=255)
    col_type: Optional[str] = Field(default=None, max_length=50)
    col_size: Optional[int] = Field(default=None)
    col_desc: Optional[str] = Field(default=None)
    show_yn: Optional[str] = Field(default=None, max_length=10)
    del_yn: Optional[str] = Field(default=None, max_length=10)

    # Foreign Key 설정
    object_id: Optional[str] = Field(foreign_key='datalake_type1.object_obj_id')

변경 후 Model

class DatalakeType1Columns(SQLModel, table=True):
    __tablename__ = 'datalake_type1_object_columns'

    object_id: str = Field(default=None, max_length=50)  # Primary Key (object_id)
    col_name: str = Field(default=None, max_length=255)  # Primary Key (col_name)
    col_name_eng: Optional[str] = Field(default=None, max_length=255)
    col_type: Optional[str] = Field(default=None, max_length=50)
    col_size: Optional[int] = Field(default=None)
    col_desc: Optional[str] = Field(default=None)
    show_yn: Optional[str] = Field(default=None, max_length=10)
    del_yn: Optional[str] = Field(default=None, max_length=10)

    # Foreign Key 설정
    object_id: Optional[str] = Field(foreign_key='datalake_type1.object_obj_id')

    # 복합키 정의
    __table_args__ = (
        PrimaryKeyConstraint('object_id', 'col_name'),
    )
728x90
저작자표시 (새창열림)

'개발 > 파이썬' 카테고리의 다른 글

python pakage manage using uv  (0) 2024.12.10
[Pydantic] langchain import Document Error  (0) 2024.11.21
Langchain mulltiple edges error, Graph Parallel Processing  (0) 2024.11.12
PGVector Insert using SQLModel  (2) 2024.11.07
[pandas] (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape  (0) 2023.04.26
'개발/파이썬' 카테고리의 다른 글
  • python pakage manage using uv
  • [Pydantic] langchain import Document Error
  • Langchain mulltiple edges error, Graph Parallel Processing
  • PGVector Insert using SQLModel
경 울
경 울
응애 。•́︿•̀。
  • 경 울
    메모장
    경 울
  • 전체
    오늘
    어제
    • 분류 전체보기 (40)
      • 개발 (19)
        • REACT (4)
        • 파이썬 (9)
        • Database (1)
        • Infra (1)
        • Android studio (1)
        • risc-v (0)
      • Maya (4)
        • Rigging (3)
      • Game Effect (9)
        • VFX 분석 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Rigging
    sqlmodel
    android studio record
    Unreal Engine
    ue game effect
    usb mount
    VFX
    maya animation
    K8S
    Maya
    SQLAlchemy
    리깅
    error 1452 (23000)
    langgraph
    game effect
    마야
    risc-v assembly
    docker
    risc-v assembly programming
    UE
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
경 울
[SQLModel] Composite Key 설정
상단으로

티스토리툴바