10

alembicを使用して、既存のMySQLテーブルに「id」主キー列を追加しようとしています。私は次のことを試みました...

op.add_column('mytable', sa.Column('id', sa.Integer(), nullable=False))
op.alter_column('mytable', 'id', autoincrement=True, existing_type=sa.Integer(), existing_server_default=False, existing_nullable=False) 

しかし、次のエラーが発生しました

sqlalchemy.exc.OperationalError: (OperationalError) (1075, 'Incorrect table definition; there can be only one auto column and it must be defined as a key') 'ALTER TABLE mytable CHANGE id id INTEGER NOT NULL AUTO_INCREMENT' ()

PRIMARY KEYalembicによって生成されたsqlステートメントがalterステートメントの最後に追加されなかったようです。いくつかの設定を見逃した可能性がありますか?

前もって感謝します!

4

2 に答える 2

25

alembic のソース コードを調べてみましたが、これはサポートされていないようです。テーブルの作成時に主キーを指定できますが、列の追加時には指定できません。実際、それは具体的にチェックし、許可しません(ソースへのリンク):

# from alembic.operations.toimpl.add_column, line 132
for constraint in t.constraints:
    if not isinstance(constraint, sa_schema.PrimaryKeyConstraint):
        operations.impl.add_constraint(constraint)

周りを見回したところ、既存のテーブルに主キーを追加すると、不特定の動作が発生する可能性があります.主キーはnullであってはならないため、エンジンは既存の行の主キーを作成する場合と作成しない場合があります. 詳細については、この SO ディスカッションを参照してください: 既存のテーブルに自動インクリメント主キーを挿入する

変更クエリを直接実行し、必要に応じて主キーを作成します。

op.execute("ALTER TABLE mytable ADD id INT PRIMARY KEY AUTO_INCREMENT;")

エンジン間の互換性が本当に必要な場合は、(1) 主キーを持つ古いテーブルと同一の新しいテーブルを作成し、(2) すべてのデータを移行し、(3) 古いテーブルを削除し、(4) ) 新しいテーブルの名前を変更します。

それが役立つことを願っています。

于 2012-12-07T06:02:51.037 に答える