Alembic数据库迁移错误
[Web Development]
从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表
解决方案
分两步迁移即可。
- 先更新表结构
- 再更新表间关系