>  Q&A  >  본문

Alembic - 복합 기본 키를 사용하면 MySQL에서 잘못된 테이블 정의가 발생합니다.

<p>자동 증가 정수 필드("id")와 날짜/시간 필드("record_valid_from")를 결합하여 복합 기본 키를 사용하는 "버전이 지정된" 데이터베이스 SQLAlchemy 모델이 여러 개 있습니다. MySQL 데이터베이스에 대해 로컬 Docker 컨테이너에서 이 모델을 실행하려고 합니다.

모델 정의는 대략 다음과 같습니다.


<pre class="brush:php;toolbar:false;">from sqlalchemy.orm import(DeclarativeBase, Mapped) 클래스 클래스A(DeclarativeBase): id: 매핑[int] = mapped_column(primary_key=True, 인덱스=True, 자동 증가=True) Record_valid_from: 매핑[날짜시간] = 매핑_열(날짜시간, Primary_key=참, default=get_current_timestamp # 이것은 datetime.now()를 반환하는 Python 메서드입니다. ) 활성: Mapped[bool] = mapped_column(부울, 기본값=True, comment="최신 버전이면 TRUE, 그렇지 않으면 FALSE" ) ... # 추가 필드와 로직</pre> <p>다른 모델도 유사해 보이지만 서로 다양한 관계를 갖고 있습니다. </p><p>Alembic을 사용하여 마이그레이션 스크립트를 자동으로 생성하는 경우(allembic revision --autogenerate -m "init Database") 생성된 Python 코드가 잘못된 SQL 문을 생성하는 것처럼 보입니다.

좀 더 구체적으로 말하자면, 다음과 같습니다.


<pre class="brush:php;toolbar:false;">(pymysql.err.OperationalError) (1075, '잘못된 테이블 정의; 자동 열은 하나만 있을 수 있으며 키로 정의되어야 합니다.')< ;/pre> <p>이전 코드는 다음과 같습니다(참고: 단순화했습니다). </p> <pre class="brush:php;toolbar:false;">def 업그레이드() -> op.create_table('classA', sa.Column('이름', sa.String(length=100), nullable=False), sa.Column('record_valid_from', sa.DateTime(), nullable=False), sa.Column('active', sa.Boolean(), nullable=False), sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), sa.PrimaryKeyConstraint('record_valid_from', 'id') ) op.create_index(op.f('ix_classA_id'), 'classA', ['id'], Unique=False)</pre> <p>혹시 비슷한 상황 겪으신 분 계신가요? 아니면 이 문제를 해결하는 방법을 알고 계십니까? </p><p>저는 다음을 시도했습니다: </p> <li>테이블을 생성한 후 op.create_primary_key를 호출합니다(참조: https://alembic.sqlalchemy.org/en/latest/ops.html#alembic.Operations.Operations.create_primary_key). 결과: sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1068, '여러 기본 키가 정의됨').<코드></code></li> <li>sa.PrimaryKeyConstraint를 제거하고 op.create_primary_key를 직접 호출하세요. 결과:
    <li>이전이 성공적으로 완료되어 정상적으로 실행되었습니다. </li> <li>새 ORM 모델을 생성하려고 시도하면 다음 오류가 발생했습니다: sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1364, "필드 'id'에 기본값이 없습니다."). <코드></code></li> </ul> </li> </ul><p><br /></p>
P粉183077097P粉183077097476일 전601

모든 응답(1)나는 대답할 것이다

  • P粉921165181

    P粉9211651812023-07-25 14:49:14

    이 문제에 대해 몇 시간을 소비하여 직접 해결했습니다. 비슷한 문제가 발생한 사람을 위한 답변은 다음과 같습니다.

    실제로 PrimaryKeyConstraint의 기본 키 필드 순서가 영향을 미칩니다. 내 문제는 sa.PrimaryKeyConstraint('record_valid_from', 'id')를 사용하는 대신 순서를 변경하여 해결되었으며 sa.PrimaryKeyConstraint("id", "record_valid_from")로 변경했습니다.

    도움이 되기를 바랍니다.


    회신하다
    0
  • 취소회신하다