未使用Flask Migrate的Heroku PostgreSQL生产库如何升级?
问题根因
你之前通过db.create_all()初始化生产库时,没有生成Flask Migrate(底层为Alembic)用来记录数据库版本的alembic_version系统表,Alembic无法判断当前生产库的表结构对应哪个迁移版本,会默认没有待执行的变更,所以执行flask db upgrade时没有任何实际操作。
解决步骤(全程不影响现有生产数据)
前置清理
- 删除本地
migrations/versions目录下所有重复生成的无效迁移文件,仅保留第一次执行flask db migrate生成的、正确识别到4个新增字段的迁移文件(版本号为a470127eb7c5的那份) - 将清理后的迁移文件夹提交到Git,推送到Heroku主分支,确保生产环境的迁移文件和本地完全一致
生产环境配置
- 进入Heroku应用的Shell终端,执行命令查看所有迁移记录:
flask db history
输出结果中最旧的那条迁移,就是和你当前生产库表结构匹配的基线版本,记录下它的版本号
备注:如果
flask db history的输出仅包含你那份新增字段的迁移,说明你之前没有生成初始建表的全量迁移,可临时将该份加字段的迁移移出versions目录,执行flask db migrate生成全量建表的初始迁移,再将加字段的迁移移回目录即可,此时基线版本为新生成的初始迁移的版本号。
- 执行标记命令,给生产库打基线版本,告诉Alembic当前库已经完成了该版本之前的所有变更:
flask db stamp <你记录的基线版本号> - 执行升级命令应用待完成的迁移:
flask db upgrade
执行完成后即可看到4个新增字段创建成功,所有现有业务数据会完整保留。
后续维护规范
- 所有迁移文件必须纳入Git版本管理,团队成员拉取代码后如果存在新的迁移文件,直接执行
flask db upgrade就能同步表结构 - 每次修改模型后仅执行一次
flask db migrate,确认生成的迁移文件内容符合预期后再提交,避免生成重复冗余的迁移文件
内容的提问来源于stack exchange,提问作者Hector Astrom
相关产品推荐
相关产品推荐

