2012-12-07 14 views
6

私は、既存のMySQLテーブルにalembicを使って 'id'プライマリキーカラムを追加しようとしています。私は、次の...alembicの既存のMySQLテーブルにプライマリキーを追加する

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'() 

は、ALTER文の末尾にPRIMARY KEYを追加しませんでしたアレンビックによって生成されたSQL文のように見え、次のエラーを得ました。私はいくつかの設定を忘れていますか?

ありがとうございます!

答えて

16

私は、ある程度の時間をかけて、大部分のソースコードを掘り下げていましたが、これはサポートされていないようです。 テーブルを作成するときに主キーを指定できますが、列を追加するときは指定できません。そう、主キーをnullにすることになっていません -

# from alembic.operations.add_column, line 284 
for constraint in t.constraints: 
    if not isinstance(constraint, schema.PrimaryKeyConstraint): 
    self.impl.add_constraint(constraint) 

は、私は周りを見回して、既存のテーブルに主キーを追加すると、不特定の動作が発生することがあります。実際には、それを具体的に確認し、あなたをさせませんエンジンは既存の行の主キーを作成する場合と作成しない場合があります。詳細については、このSOの議論を参照してください。Insert auto increment primary key to existing table

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

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

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

希望に役立ちます。