<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>