cdxy.me
Footprints on Cyber Security and Python

从WordPress的博客数据迁到Flask,表结构发生很多变化,在手动修改了表名后想要使用Alembic自动将column的属性同步时出现错误。

均由外键的不同步引起,Alembic的更新是无序的。

外键添加失败

sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1452, u'Cannot add or update a child row: a foreign key constraint fails (`flask1`.`#sql-4a3_192`, CONSTRAINT `#sql-4a3_192_ibfk_1` FOREIGN KEY (`post_id`) REFERENCES `post` (`id`))') [SQL: u'ALTER TABLE post_tags ADD FOREIGN KEY(post_id) REFERENCES post (id)']

失败原因:

  • 外键指向目标不存在
  • 外键与目标结构不一致
  • 外键中的数据在目标数据表中找不到

在自动迁移的过程中修改是无序的,假设A->B,当程序修改到A表的外键时,B表结构还未修改,导致外键修改失败。

建表失败

sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1005, u"Can't create table 'flask1.#sql-4b8_a3' (errno: 150)") [SQL: u'ALTER TABLE comment ADD FOREIGN KEY(post_id) REFERENCES post (id)']

sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1005, u"Can't create table 'flask1.post_categories' (errno: 150)") [SQL: u'\nCREATE TABLE post_categories (\n\tpost_id INTEGER, \n\tcategory_id INTEGER, \n\tFOREIGN KEY(category_id) REFERENCES category (id), \n\tFOREIGN KEY(post_id) REFERENCES post (id)\n)\n\n']

外键无法添加导致建表失败。

无法提交迁移

alembic.util.exc.CommandError: Can't locate revision identified by '4a9bea7b1676'

删除数据库中的alembic表

解决方案

分两步迁移即可。

  • 先更新表结构
  • 再更新表间关系