flask-migrate数据迁移后再中途部署的同步方案

2019年3月7日更新:

实际上,我在之后查阅资料得知,比较好的方案是在所部署服务器进行数据库迁移,而不是在开发环境(也就是写代码的地方)进行数据库迁移。如果在所部署服务器进行数据库迁移,那么无论model代码怎么改,中途再部署的服务器都不会受影响,因为数据库迁移脚本随是和部署服务器放在一起的,而不是和开发源码放在一起。

当然如果所部署服务器没法操作,那就只能在本地先迁移好在上传到部署服务器了。


使用flask-migrate对flask web app进行数据库迁移非常方便,通常的迁移步骤如下:

  1. 开发完flask web app;

  2. 部署flask web app到服务器;

  3. 发现需要修改数据库,于是使用flask-migrate进行数据库迁移;

    flask db init
    flask db migrate
    flask db upgrade
    
  4. 服务器的app更新代码,并进行更新

    flask db upgrade
    

以上步骤是正确的,但是想象那么一个场景:

  1. 数据库迁移后,突然需要再另一台新的服务器部署flask web app;

  2. 假设我们在新服务器使用 flask initdb 初始化数据库,此时新服务器的数据库对应的model是最新的数据表;

  3. 对新服务器的 flask web app 使用下面命令

    flask db upgrade
    

就会出错。因为新数据库没有记录数据库迁移到了哪一个版本,所以数据库迁移是从第一条记录开始,于是对已经存在的数据表字段进行修改,最后就报错了。

那么怎样解决这个问题呢?使用下面命令把当前数据库版本标记进去即可。

flask db stamp <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表的内容。数据迁移版本号是一致的。

你可能感兴趣的:(Flask,Python,Web)