2012-12-07 9 views
6

içinde varolan MySQL tablonun birincil anahtarını ekleme Ben derleme kullanarak zaten varolan bir MySQL tablosuna bir 'id' birincil anahtar sütunu eklemeye çalışıyorum. Aşağıdaki ...Anembic

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) 

çalıştı ama

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 deyimi sonunda PRIMARY KEY eklemek vermedi alembic tarafından oluşturulan sql deyimi benziyor aşağıdaki hata var. Bazı ayarları özleyebilir miyim?

Şimdiden teşekkürler!

cevap

16

Alembic kaynak koduyla biraz zaman geçirdim ve bu desteklenmiyor gibi görünüyor. Bir tablo oluştururken bir tablo oluştururken birincil sütunlar belirtebilirsiniz, ancak sütun eklerken. böylece, birincil anahtarlar boş olması gerekiyordu değil -

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

Etrafa baktım ve mevcut bir tabloya birincil anahtar ekleyerek belirtilmemiş davranışlara neden olabilir: Aslında, özellikle kontrol eder ve size izin vermez Motorunuz mevcut satırlar için birincil anahtarlar oluşturabilir veya oluşturmayabilir. Daha fazla bilgi için bu tartışmaya bakın: Insert auto increment primary key to existing table

Sadece alter sorgularını doğrudan çalıştırıyorum ve gerekiyorsa birincil anahtarlar oluşturdum.

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

gerçekten çapraz motor uyumluluğu gerekiyorsa, büyük çekiç olacaktır (1), (2) tüm verileri taşımak, bir birincil anahtarla eskisinin aynısı yeni bir tablo oluşturmak (3) eski tabloyu silin ve (4) yeni tabloyu yeniden adlandırın.

Bu yardımcı olur umarım.