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.
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 –
@ RachelSanders fand ich bei der Suche nach Antworten. Hoffte, dass sich etwas seit 2012 verbessert hat. Danke für die Antwort! – Eli
@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