使用 db.create_all() 后期修改或者增加字段的时候,不会自动映射到数据库中,必须删除表,然后重新运行 db.create_all() 才会重新映射

flask-migrate 可以将修改的字段映射到数据库中

老版本的 flask-migrate 需配合 flask-script 使用,由于 flask-script 长久不维护,且没有适配 flask 2.0 以上的版本,所以 flask-migrate 去掉了 flask-script 的支持

官方文档:https://flask-migrate.readthedocs.io/en/latest

安装

1
2
$ activate # 进入虚拟环境
$ pip install flask-migrate # 当前版本为 3.1.0

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from flask import *
import config
from db import db
from models import *
+ from flask_migrate import Migrate

app = Flask(__name__)
app.config.from_object(config)

db.init_app(app)
- # db.create_all(app=app)
+ migrate = Migrate(app, db)


@app.route('/')
return render_template('index.html')


if __name__ == '__main__':
app.run()
1
2
3
4
$ activate
$ flask db init # 默认 flask 启动文件为 app.py,不是的话需要更改环境变量
$ flask db migrate -m "initial migration" # -m 会将内容添加到版本文件名中
$ flask db upgrade

flask db init 会生成 migrations 文件夹,目录结构如下:

image-20220317234651916

排坑

只有在新增或者删减字段时 flask db migrate 才会起作用

更新表字段不起作用,输出 INFO [alembic.env] No changes in schema detected.

经过多方查询,需更改 migrations -> env.py 中的配置项

1
2
3
4
5
6
7
8
def run_migrations_online():
# ...
with connectable.connect() as connection:
context.configure(
# ...
+ compare_type=True, # 检查字段类型
+ compare_server_default=True, # 比较默认值
)