在拓展框架中我了解到了Flask-SQLAlchemy框架,但是这个框架仅仅能起到创建数据表的操作。一旦数据表已经创建,该数据表的结构就已经确定了。若要改变数据表的结构,只能先使用drop_all()方法先删除数据表,然后在对应的模型类里面新增一个成员属性,再调用create_all()方法重新创建数据表。也就是说Flask-SQLAlchemy框架不支持执行alter语句的功能。因此SQLAlchemy的开发者就开发了另一个工具让它能操作数据表,改变数据表的结构,这个工具就是Alembic,这个工具集成在Flask-Migrate框架中。
Flask-Migrate的安装
在venv虚拟环境中使用pip install Flask-Migrate语句就可以安装这个框架。
Flask-Migrate的使用
查看帮助
Flask-Migrate提供了一个命令集,使用db作为命令集名称,可以执行flask db --help来查看Flask-Migrate的基本使用。
创建迁移环境
使用Flask-Migrate可以创建迁移环境,需要Migrate类,代码如下:
python 代码:from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:254456@localhost/db_flask'
db = SQLAlchemy(app)
migrate = Migrate(app, db)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
articles = db.relationship('Articles')
def __repr__(self):
return '<User %r>' % self.username
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(80), index=True)
content = db.Column(db.Text)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
def __repr__(self):
return '<User %r>' % self.username
if __name__ == '__main__':
with app.app_context():
db.create_all()
在上述代码中,实例化Migrate类时传入了两个参数,第一个参数时应用程序实例,第二个参数是SQLAlchemy的实例化对象。
接下来需要使用FLASK_APP变量定义如何载入应用。不同的操作系统操作不同。
set FLASK_APP=manage.py
“FLASK_APP=manage.py中间没有空格,其中manage.py指创建迁移环境的Python文件,且它是会话变量。”
export FLASK_APP=manage.py
准备就绪,开始创建一个迁移环境,执行如下命令:
bash 代码:flask db init
执行成功后会在项目根目录下创建一个migrations文件夹,其中包含了配置文件和迁移版本文件。
生成迁移脚本
创建完迁移环境后执行如下命令,自动生成迁移脚本:
这里假设我们要增加的字段为gender。bash 代码:
flask db migrate -m "add gender for user table"
执行后会在migrations/versions/目录下生成一个迁移脚本文件,关键代码如下:
python 代码:def upgrate():
# ###commands auto generated by Alembic - please adjust!###
op.add_column('user', sa.column('gender', ga.BOOLEAN(), nullable=True))
###end Alembic commands###
def downgrate():
# ###commands auto generated by Alembic - please adjust!###
op.drop_column('user', 'gender')
###end Alembic commands###
上述代码中,upgrate()函数就是用于将改动应用到数据库的函数。
每一次生成迁移脚本都会生成一个新的版本号,方便随时回退。
更新数据库
生成迁移脚本后,就可以输入下面的命令执行更新脚本:
bash 代码:flask db upgrad
执行此语句后数据库就会生成一个alembic_version表,用于记录当前版本号,修改的user表就会新增一个gender字段。
迁移环境只需要创建一次,也就是说下次不需要再创建迁移环境,只需要执行flask db migrate
和flask db upgrad
命令即可。