2015-03-12 12 views
11

Ich habe the docs gelesen, aber ich kann nirgendwo Anweisungen finden. Ich habe versucht, den alten Schlüssel fallen zu lassen und einen neuen hinzuzufügen, aber das bringt mir Fehler:Alter Primärschlüssel in Alembic?

op.drop_constraint('PRIMARY', 'some_table', type_='primary') 
op.create_primary_key('PRIMARY', 'some_table', ['col1', 'col2']) 

sqlalchemy.exc.OperationalError: (OperationalError) (1025, "Error on rename of ... (errno: 150 - Foreign key constraint is incorrectly formed)") 'ALTER TABLE some_table DROP PRIMARY KEY '() 

Was mache ich falsch?

+0

Es ist nicht ganz dasselbe, aber das könnte helfen: http://stackoverflow.com/questions/13756567/adding-primary-key-to-existing-mysql-table-in-alembic/13757758#13757758 –

+0

@ RachelSanders fand ich bei der Suche nach Antworten. Hoffte, dass sich etwas seit 2012 verbessert hat. Danke für die Antwort! – Eli

+0

@Eli Es wäre sehr nützlich das nächste Mal, wenn Sie die Antwort auf Ihre eigene Frage finden, wenn Sie es unten posten würden. Auf einer schnellen Google-Suche nach "Alembic Alter Primärschlüssel" ist dieser Beitrag das erste Ergebnis. Ich will nicht wie ein Idiot rüberkommen, sondern eine Frage mit einem Update vom Originalplakat mit "Ich habe die Antwort gefunden" und keine Details mehr machen wirklich nichts für die Community: - /. – Frito

Antwort

3

Ich stieß auf diese Frage auf der Suche nach einer Beispielmigration. So, hier ist meine vollständige Migration, die die PK Einschränkung fällt und fügt einen neuen AUTO INCREMENT PK statt:

from alembic import op 
import sqlalchemy as sa 
from sqlalchemy.dialects.mysql import INTEGER 


def upgrade(): 
    op.drop_constraint('PRIMARY', 'similar_orders', type_='primary') 

    op.execute("ALTER TABLE similar_orders ADD COLUMN id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT") 


def downgrade(): 
    op.drop_column('similar_orders', 'id') 

    op.create_primary_key("similar_orders_pk", "similar_orders", ["order_id", ]) 

Altering PK auf Spalte nicht in alembic funktioniert, verwenden Sie drop_constraint statt finden here. Hoffe das hilft!

1

Ich war auch in der gleichen Situation: alter Primärschlüssel. In meinem Fall musste ich den Primärschlüsseltyp von Integer in String ändern.

Der Primärschlüssel hatte auch eine Fremdschlüsselbeziehung zu einer anderen Tabelle. Die frühere alembic Migration der Fremdschlüssel in der folgenden Art und Weise erstellt:

#!/usr/bin/python3 

from alembic import op 
import sqlalchemy as sa 


def upgrade(): 
    op.create_table('user', 
        sa.Column('id', sa.Integer(), nullable=False), 
        sa.Column('name', sa.String(length=100), nullable=False), 
        sa.Column('username', sa.String(length=100), nullable=False), 
        sa.PrimaryKeyConstraint('id', name=op.f('pk_user')), 
        sa.UniqueConstraint('username', name=op.f('uq_user_username')) 
        ) 

    op.create_table('role', 
        sa.Column('id', sa.Integer, primary_key=True), 
        sa.Column('name', sa.String(100)), 
        sa.Column('description', sa.String(255)), 
        sa.PrimaryKeyConstraint('id', name=op.f('pk_role')) 
        ) 

    op.create_table('roles_users', 
        sa.Column('user_id', sa.Integer, nullable=True), 
        sa.Column('role_id', sa.Integer, nullable=True), 
        sa.ForeignKeyConstraint(['user_id'], ['user.id'], 
              name=op.f('fk_roles_user_user_id_user')), 
        sa.ForeignKeyConstraint(['role_id'], ['role.id'], 
              name=op.f('fk_roles_user_role_id_role')) 
        ) 
Jetzt

wenn Integer-String den Primärschlüssel Typ des user Tabelle zu ändern, hatte ich folgendes zu tun:

from alembic import op 
import sqlalchemy as sa 


def upgrade(): 
    # Drop primary key constraint. Note the CASCASE clause - this deletes the foreign key constraint. 
    op.execute('ALTER TABLE user DROP CONSTRAINT pk_user CASCADE') 
    # Change primary key type 
    op.alter_column('user', 'id', existing_type=sa.Integer, type_=sa.VARCHAR(length=25)) 
    op.alter_column('roles_users', 'user_id', existing_type=sa.Integer, type_=sa.VARCHAR(length=25)) 
    # Re-create the primary key constraint 
    op.create_primary_key('pk_user', 'user', ['id']) 
    # Re-create the foreign key constraint 
    op.create_foreign_key('fk_roles_user_user_id_user', 'roles_users', 'user', ['user_id'], ['id'], ondelete='CASCADE') 

Flask Version: 0.12.1

Alembic Version: 0.9.1

Python-Version: 3.4.4

Ich hoffe, diese Informationen helfen jemandem, der vor einem ähnlichen Problem steht.

Verwandte Themen