ORM模型迁移
ORM 模型定义好后,是通过 db.create_all 将 ORM 模型映射到数据库中的。这种方式是有局限性的,它只能识别到新增了模型后映射到数据库中的对于模型中字段的修改,对于类型的修改,无法识别到。因此在实际开发中,都不会使用 db.create_all 来做 ORM 模型迁移,而是借助一个第三方插件 Flask-Migrate 来实现。Flask-Migrate 是基于 alembic 实现的,alembic 是专门用来给 SQLAlchemy 的 ORM 模型做迁移的。要使用Flask-Migrate,首先需要通过 pip 命令安装。
pip install flask-migrate
alembic 会随着 flask-migrate 安装而自动安装。在完成 flask-migrate 安装后,接下来讲解如何配置。
创建迁移对象
首先看创建迁移对象的代码,如下所示。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
# 配置数据库等其他设置
db = SQLAlchemy(app)
migrate = Migrate(app, db)
以上代码中,首先从 flask_migrate 包中导入 Migrate 类,然后实例化这个类,在实例化时传入 app 和 db 对象,并且赋值给 migrate 变量。后续在执行迁移命令时,Flask-Migrate 会自动读取 app.py 中的 migrate 变量,所以变量名必须为 migrate。
初始化迁移环境
在创建完迁移对象后,需要初始化迁移环境。方法是在当前项目的根路径下执行如下命令。
flask db init
命令执行完成后,会在项目的根路径下生成一个 migrations 文件夹,在这个文件夹下有以下文件或文件夹。
-
versions:文件夹,用于存放后面生成的迁移脚本文件。由于目前没有生成过任何迁移脚本,因此是一个空的文件夹。
-
alembic.ini:alembic 的配置文件。
-
env.py:配合 Flask 项目进行迁移的 Python 文件。
-
script.py.mako:生成迁移脚本的模板文件。
以上 4 个文件或文件夹,除非你自己非常清楚要做什么,否则强烈建议不要自行修改里面的内容。到目前为止,初始化迁移环境的工作就已经完成。此工作只需做一次,后续只要不断生成迁移脚本和映射脚本即可,无须重复初始化。
生成迁移脚本
在初始化完迁移环境的前提下,无论是新增了 ORM 模型,或者是 ORM 模型中有任何字段信息发生改变,并且要将这些改变同步到数据库中,都要做的一件事情就是将当前的修改生成一个迁移脚本,生成迁移脚本的命令如下。
flask db migrate -m "备注信息"
以上命令中参数 -m
后面跟的是备注信息,通过添加备注信息,可方便以后查看当前迁移脚本做了哪些事情。当然,备注信息不是必需的,如果不想添加,则把 -m
参数以及后面的内容都删除即可。笔者强烈建议添加备注信息,特别是多人合作开发一个项目时,添加备注信息能让工作更加透明。在执行完以上命令后,可以看到 versions 文件夹中新增了一个 Python 脚本文件,这个脚本文件中记录了此次修改的变更内容。
执行迁移脚本
迁移脚本只是写好了表变更的内容,但是并没有更新数据库。因此还需要执行迁移脚本将这些改变真正映射到数据库中,执行迁移脚本的命令如下。
flask db upgrade
以上命令会自动从 versions 文件夹中寻找最新的迁移脚本文件,然后执行迁移脚本文件中的 upgrade 函数。在这步工作完成后,模型的修改就能真正映射到数据库中了。
使用 flask-migrate 做 ORM 模型迁移时,有一点需要注意,被迁移的 ORM 模型必须被 app.py 直接或间接加载。如为了代码更加有序,我们一般会把 ORM 模型放到 models.py 文件中,如果这个 models.py 文件没有被 app.py 直接或间接加载,那么其中的 ORM 模型将不能被 flask-migrate 识别到,也就不会参与迁移。