2019年3月7日更新:
实际上,我在之后查阅资料得知,比较好的方案是在所部署服务器进行数据库迁移,而不是在开发环境(也就是写代码的地方)进行数据库迁移。如果在所部署服务器进行数据库迁移,那么无论model代码怎么改,中途再部署的服务器都不会受影响,因为数据库迁移脚本随是和部署服务器放在一起的,而不是和开发源码放在一起。
当然如果所部署服务器没法操作,那就只能在本地先迁移好在上传到部署服务器了。
使用flask-migrate对flask web app进行数据库迁移非常方便,通常的迁移步骤如下:
-
开发完flask web app;
-
部署flask web app到服务器;
-
发现需要修改数据库,于是使用flask-migrate进行数据库迁移;
flask db init flask db migrate flask db upgrade
-
服务器的app更新代码,并进行更新
flask db upgrade
以上步骤是正确的,但是想象那么一个场景:
-
数据库迁移后,突然需要再另一台新的服务器部署flask web app;
-
假设我们在新服务器使用
flask initdb
初始化数据库,此时新服务器的数据库对应的model是最新的数据表; -
对新服务器的 flask web app 使用下面命令
flask db upgrade
就会出错。因为新数据库没有记录数据库迁移到了哪一个版本,所以数据库迁移是从第一条记录开始,于是对已经存在的数据表字段进行修改,最后就报错了。
那么怎样解决这个问题呢?使用下面命令把当前数据库版本标记进去即可。
flask db stamp <revision>
<revision>
是数据库迁移的版本,我们可以使用下面命令查看:
flask db heads # 显示最后一次数据库迁移版本(?),heads应该类似于git的head
# OR
# flask db current # 显示当前数据库迁移版本
因此,在新服务器上我们只需要执行以下两条命令,即可对新服务器的flask web app标记上当前数据库迁移的版本,示例如下:
$ flask db heads
d74d475e2a58 (head)
$ flask db stamp d74d475e2a58
操作完成之后,再次执行 flask db upgrade
试试看,已经不会报错了,因为新服务器的数据库是最新版本了。新服务器的数据库也可以愉快地继续后续数据库迁移了。
最后,可以对比下新旧服务器的数据库中,alembic_version表的内容。数据迁移版本号是一致的。