1. 背景说明:
通过SQLAlchemy来创建表的时候,采用的是db.create_all()方法(该方法只能使用一次),这种方法有一个非常严重的问题,就是当我们需要添加或者删除数据库表中的字段的时候,直接修改Models里面的类是没有用的,必须要把数据库删除了,然后重新执行db.create_all()方法,才会把我们修改的内容映射到数据库中,这在项目上线之后,数据库中已经存在数据了,如果要更新数据库了,这种方法是万万不可采用的,不可能把数据库删了,在重新新建,这时候就需要对数据库进行迁移,该迁移类似于Django框架中的迁移。flask_migrate可以通过命令把修改后的模型直接映射到数据库中而不用删除数据库。
2. 安装包 flask-migrate
pip install flask-migrate
3. 记录下代码
3.1 新建config.py文件,该文件用来写入相关配置,下面我们配置数据库相关
DIALECT = 'mysql' # 要用的什么数据库
DRIVER = 'pymysql' # 连接数据库驱动
USERNAME = 'root' # 用户名
PASSWORD = '123456' # 密码
HOST = 'localhost' # 服务器
PORT = '3307' # 端口
DATABASE = 'migrate_test' # 数据库名
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT,
DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False
3.2 在models中新建模型Article
先将SQLAlchemy实例化对象,此处为了不出现导包循环,我们单独将对象实例化写道exts.py中,如下:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
获得db实例化对象,开始进行模型创建
from exts import db
class Article(db.Model):
__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)
category = db.Column(db.String(10))
img = db.Column(db.String(200))
3.3 为了清楚的表示MVC模式,MTV模式,此处我们将路由部分放在了views.py中
代码如下:
from flask import Blueprint
blue = Blueprint('test', __name__)
@blue.route('/')
def hello():
return 'hello flask'
3.4 重点:manage.py文件
代码如下:
from flask import Flask
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from config import SQLALCHEMY_DATABASE_URI, SQLALCHEMY_TRACK_MODIFICATIONS
from exts import db
from views import blue
# 在进行迁移时,必须导入模型,不然数据库不会改变
from models import Article
app = Flask(__name__)
app.register_blueprint(blueprint=blue, url_prefix='/app')
app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = SQLALCHEMY_TRACK_MODIFICATIONS
db.init_app(app)
manager = Manager(app)
# init migrate upgrade
# 模型 -> 迁移文件 -> 表
# 1.要使用flask_migrate,必须绑定app和DB
migrate = Migrate(app, db)
# 2.把migrateCommand命令添加到manager中。
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
manager.run()
第一次进行迁移时:
python manage.py db init # 初始化迁移文件,系统默认生成migrate文件夹
python manage.py db migrate # 检查模型字段是否修改,如果改变,就产生新的迁移文件.
python manage.py db upgrade # 对迁移文件进行迁移
后面迁移:(只需要进行如下两步骤):
python manage.py db migrate # 检查模型字段是否修改,如果改变,就产生新的迁移文件.
python manage.py db upgrade # 对迁移文件进行迁移