Flask-migrate更新表字段时不起作用

Flask-migrate更新表字段时不起作用

背景: 使用Flask+Sqlalchemy+migrate时使用命令db migrate后表中字段并未新增

表结构如下:

Flask-migrate更新表字段时不起作用_第1张图片

如图, 新增begin_at, end_at字段, 但执行迁移命令时并未改变表字段

Flask-migrate更新表字段时不起作用_第2张图片

错误排查

排查1

查阅大量资料后,发现Flask-migrate库会依赖alembic, 以此记录每次更改的版本号

这句话引起了我的注意

compare_type属性在migrateions目录下 的env.py文件下的run_migrations_online函数中添加.像这样

context.configure(
          …………
          compare_type=True,  # 检查字段类型
          compare_server_default=True # 比较默认值
          )

但实际上添加了以后并没什么用。

排查2

怀疑是flask-migrate版本有问题,于是更新了flask和Flask-migrate库的版本号

pip install -U Flask flask-migrate

继续执行, 发现报错

继续google后发现是因为我把本地migrations文件删了重新init,但数据库中的alembic_version表还存储着这个版本,导致无法migrate, 如下图这样

Flask-migrate更新表字段时不起作用_第3张图片

删掉数据库存储的这条数据以后继续执行

Flask-migrate更新表字段时不起作用_第4张图片

? ? ? 一番查找之后使用下面命令完美解决

Question

**db stamp heads到底做了什么事? **
翻阅flask-migrate文档会看到它的作用

Flask-migrate更新表字段时不起作用_第5张图片

总结

综合考虑,如果遇到上面的问题,在实在搜不到解决方案或者不管用的情况下,可以考虑下更新库的版本, 可能这个bug在新的版本就已被修复, 关于flask db的各个命令含义,适当了解也会解决不少问题

建议不要一出问题就删除migrations文件, 它的作用就相当于git的版本控制, 如果一次版本出错就删整个存储包,那肯定会出问题, 不如多了解下其他命令, 考虑更好的解决方案。

你可能感兴趣的:(#,积攒的bug,#,python后端-Flask)