我正在使用Alembic和SQLAlchemy迁移到MySQL数据库。
我正在尝试重命名tablea
中的主键,而这恰好是tableb
中的外键。由于MySQL不允许我直接重命名该列,因此我必须删除外键约束,重命名该列,然后再添加约束。
升级脚本如下:
from alembic import op
from sqlalchemy.types import String
def upgrade():
op.drop_constraint('tableb_ibfk_1', 'tableb', type_='foreignkey')
op.alter_column('tablea', 'id', new_column_name='a_id',
type_=String(64, collation='utf8mb4_unicode_ci'), nullable=False)
op.create_foreign_key('tableb_ibfk_1', 'tableb', 'tablea', ['a_id'], ['a_id'])
但是,此迁移是不确定的:有时成功,有时失败,并显示以下信息:
sqlalchemy.exc.IntegrityError: (MySQLdb._exceptions.IntegrityError) (1215, 'Cannot add foreign key constraint')
[SQL: ALTER TABLE tableb ADD CONSTRAINT tableb_ibfk_1 FOREIGN KEY(a_id) REFERENCES tablea (a_id)]
(Background on this error at: http://sqlalche.me/e/gkpj)
有人能阐明为什么这种迁移有时只能成功吗?两个表都以InnoDB
作为引擎。