1、简介及安装
- 在实际开发中经常存在后期进行数据库修改行为,一般我们修改数据库不会手动修改,而是修改ORM对应的模型,然后把数据库模型映射到数据库中。
- 之前的方法
db.creat_all()
方法只在第一次运行时会执行,在后期再次修改数据库的字段时,不会再自动的映射到数据库中,必须删除表,然后重新运行db.creat_all()
才能生效,重新进行映射。这不符合我们的需求。 - 因此
flask-migrate
就是解决这个问题的。flask-migrate
是基于Alembic
进行的一个封装,并集成到Flask中,而所有的迁移操作其实都是Alembic
做的,他能跟踪模型的变化,并将变化映射到数据库中
使用flask-migrate
需要安装,命令如下:(首先需要激活本项目的虚拟环境)
pip install flask-migrate
使用flask_migrate
必须借助flask_scripts
,这个包的MigrateCommand
中包含了所有和数据库相关的命令。
2、准备工作
- 在新的项目中新建一个
config.py
文件,连接数据库驱动。 - 新建一个
exts.py
文件:
# exts.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
- 新建一个
models.py
文件:
# models.py
from exts import db
# 创建映射表
class Article(db.Model): #模型必须继承db.Model
#db.Column映射到表中字段,primary_key主键,autoincrement自增,nullable可为空(默认为True)
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key= True, autoincrement = True)
title = db.Column(db.String(100),nullable = False)
content = db.Column(db.Text, nullable = False)
- 主app文件
flaskmigrate.py
# flaskmigrate.py
from flask import Flask
from exts import db
import config
from models import Article
app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)
@app.route('/')
def index():
return 'hello Python'
if __name__=='__main__':
app.run(debug=True)
manager.py
文件:
# manager.py
from flask_script import Manager
from flaskmigrate import app
from flask_migrate import Migrate,MigrateCommand
from exts import db
from models import Article
manager = Manager(app)
# 1.要使用flask_migrate,必须绑定app和db
migrate = Migrate(app,db)
# 2.把MigrateCommand命令添加到manager中
manager.add_command('db',MigrateCommand)
if __name__ == '__main__':
manager.run()
注意: 一定不要忘记在flaskmigrate.py
文件中导入Article
数据表模型类,
3、运行
调试需要在终端命令行进行。
在调试前,可以先观察下,在该项目中不存在migrations
这个文件夹
下面开始运行flask_migrate
相关的命令:(依次运行下面的三条命令)
python manage.py db init
初始化一个迁移脚本的环境,只需要执行一次,执行完该条鱼具后,我们可以观察到在该项目下被创建了一个migrations
文件夹,但是migrations/versions
文件夹下是空的。python manage.py db migrate
将模型生成迁移文件,该条语句执行完后,会发现该项目下的migrations/versions
文件夹内有文件了。在后期如果对模型进行了修改,就需要再执行一次这个命令。python manage.py db upgrade
最后添加将映射文件真正的映射到数据库中。此时查看数据库的中被创建了article
这个表,且表中有已定义的几个字段。在后期如果对模型进行了修改,就需要执行完上一个命令后,再执行一次这个命令。
注意: 在后期如果对模型进行了修改,就需要再一遍上面的第2-3条命令。,第一条命令无需再运行。
举例:
如果我们对models.py
文件中的Article
类进行了修改,比如添加了一个字段tags
,如下:
# models.py
from exts import db
# 创建映射表
class Article(db.Model): #模型必须继承db.Model
#db.Column映射到表中字段,primary_key主键,autoincrement自增,nullable可为空(默认为True)
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key= True, autoincrement = True)
title = db.Column(db.String(100),nullable = False)
content = db.Column(db.Text, nullable = False)
tags = db.Column(db.String(100), nullable = False)
则只需再在终端执行python manage.py db migrate
和python manage.py db upgrade
这两条命令就可实现对article
这个表的修改,即被添加了tags
这个字段。
以上笔记整理自知了课堂黄勇老师讲解的教学视频《Flask框架入门到实战开发》的第三章第12小节内容,不足之处,望不吝赐教!