モデルの定義は大まかに次のとおりです。</p>gt;
</p>
<pre class="brush:php;toolbar:false;">sqlalchemy.orm インポートから (DeclarativeBase、マップ済み)
クラスクラスA(DeclarativeBase):
id: Mapped[int] =mapped_column(primary_key=True、index=True、autoincrement=True)
Record_valid_from: Mapped[datetime] = mapped_column(DateTime,
プライマリキー=真、
default=get_current_timestamp # これは datetime.now() を返す Python メソッドです
)
アクティブ: Mapped[bool] = mapped_column(ブール値、デフォルト=True、
コメント="最新バージョンの場合は TRUE、それ以外の場合は FALSE"
)
... # さらにいくつかのフィールドとロジック</pre>
<p>他のモデルも同様に見えますが、モデル間にはさまざまな関係があります。 </p><p>Alembic を使用して移行スクリプトを自動的に生成する場合 (alembic リビジョン --autogenerate -m "init database")、生成された Python コードは無効な SQL ステートメントを生成するように見えます。 </p>
より具体的には、次のような問題に遭遇しました。</p>
<pre class="brush:php;toolbar:false;">(pymysql.err.OperationalError) (1075, 'テーブル定義が正しくありません。自動列は 1 つだけ存在でき、キーとして定義する必要があります')< ;/前> <p>移行コードは次のとおりです (注: 簡略化しています): </p> <pre class="brush:php;toolbar:false;">def upgrade() -> なし: op.create_table('クラスA', sa.Column('name', 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><p><br /></p>
この問題の解決に数時間を費やし、自分で修正しました。同様の問題に遭遇した人のために、これが答えです:
実際には、PrimaryKeyConstraint 内の主キー フィールドの順序が影響します。私の問題は、順序を変更することで解決しました。sa.PrimaryKeyConstraint('record_valid_from', 'id') を使用する代わりに、sa.PrimaryKeyConstraint("id", "record_valid_from") に変更しました。 ######お役に立てれば。