Alembic - 複合主キーを使用すると、MySQL で不正なテーブル定義が発生する
P粉183077097
P粉183077097 2023-07-24 22:17:01
0
1
623
<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>

    <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、「複数の主キーが定義されています」)。<コード></コード></li> <li>sa.PrimaryKeyConstraint を削除し、op.create_primary_key を直接呼び出します。結果:
      <li>移行は成功し、正常に実行されました。 </li> <li>新しい ORM モデルを作成しようとすると、次のエラーが発生しました: sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1364、「フィールド 'id' にはデフォルト値がありません」)。 <コード></コード></li> </ul> </li> </ul>


P粉183077097
P粉183077097

全員に返信(1)
P粉921165181

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

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート