2012-12-07 11 views
6

Ich versuche, eine 'id' Primärschlüsselspalte zu einer bereits bestehenden MySQL-Tabelle mit Alembic hinzuzufügen. Ich habe versucht, die folgenden ...Hinzufügen von Primärschlüssel zu bestehenden MySQL-Tabelle in Alembic

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) 

bekam aber den folgenden Fehler

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

wie die SQL-Anweisung von alembic erzeugt sieht nicht PRIMARY KEY am Ende der alten Anweisung hinzugefügt hat. Könnte ich einige Einstellungen verpasst haben?

Vielen Dank im Voraus!

Antwort

16

Ich habe einige Zeit damit verbracht, den Alembic-Quellcode zu durchsuchen, und das scheint nicht unterstützt zu werden. Sie können Primärschlüssel angeben, wenn eine Tabelle erstellen, aber nicht beim Hinzufügen von Spalten. In der Tat, überprüft es speziell und läßt Sie nicht:

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

Ich sehe mich um, und einen Primärschlüssel zu einer vorhandenen Tabelle hinzugefügt zu undefiniertem Verhalten führen kann - Primärschlüssel ist nicht als null angenommen, so Ihr Modul kann Primärschlüssel für vorhandene Zeilen erstellen oder nicht. Sehen Sie diese SO Diskussion für weitere Informationen: Insert auto increment primary key to existing table

Ich würde nur die Alter-Abfrage direkt ausführen und Primärschlüssel erstellen, wenn Sie müssen.

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

Wenn Sie wirklich Cross-Motor Kompatibilität benötigen, würde der großen Hammer sein (1) Erstellen Sie eine neue Tabelle identisch mit dem alten mit einem Primärschlüssel, (2) wandern alle Daten, (3) lösche die alte Tabelle und (4) benenne die neue Tabelle um.

Hoffe, dass hilft.

Verwandte Themen