SQLAlchemy迁移有时无法添加外键约束(alembic)

2024-10-01 02:23:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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作为它们的引擎。你知道吗


Tags: fromimportidstringsqlalchemytypemysqlcolumn