検索

ホームページ  >  に質問  >  本文

Alembic - 複合主キーを使用すると、MySQL で不正なテーブル定義が発生する

<p>自動インクリメントする整数フィールド (「id」) と日時フィールド (「record_valid_from」) を組み合わせることで実現される、複合主キーを使用する複数の「バージョン管理された」データベース SQLAlchemy モデルがあります。このモデルをローカルの Docker コンテナーで MySQL データベースに対して実行しようとしています。 </p>gt;

モデルの定義は大まかに次のとおりです。</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>

P粉183077097P粉183077097490日前620

全員に返信(1)返信します

  • P粉921165181

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

    この問題の解決に数時間を費やし、自分で修正しました。同様の問題に遭遇した人のために、これが答えです:

    実際には、PrimaryKeyConstraint 内の主キー フィールドの順序が影響します。私の問題は、順序を変更することで解決しました。sa.PrimaryKeyConstraint('record_valid_from', 'id') を使用する代わりに、sa.PrimaryKeyConstraint("id", "record_valid_from") に変更しました。 ######お役に立てれば。

    返事
    0
  • キャンセル返事