【Python】Flask框架系列(四):Flask-Migrate数据库迁移
Flask-Migrate
通过数据库迁移技术直接创建数据库表而无需编写SQL语句来建立表的状态。相当于将关系型数据库中的各个表转化为Python中的一个个类对象。
开发过程中时常会遇到需调整原有数据库架构的情形。这些情况下通常会采取将现有旧架构的数据迁移到新架构的方式进行更新至新的架构后需同步至数据库系统。其中最直接的方式即是删除现有旧架构的数据表并在此基础上构建新的数据模型以便适应业务需求的变化。这种做法的主要缺陷在于可能导致数据不一致或丢失。
借助数据库迁移技术,可以通过监控模式变化来实现对相应调整的正确应用
通过flask框架中的flask-migrate功能支持数据库迁移操作,并将其整合到flask-script环境中以处理各种迁移需求。所有相关的操作都将以命令行方式执行。
该工具旨在生成数据库迁移命令,并被配置为与Flask-Script的管理器对象集成。
迁移示例
1、创建迁移仓库
原始food表

希望新增一列
class Food(UserMixin, db.Model):
__tablename__ = 'food'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
addcol = db.column(db.String(64)) # 新增
py
全部代码 app.py
#coding:utf-8
from flask import Flask
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
app.config['SQLALCHEMY_DATABASE_URI'] ='mysql+pymysql://root:g67108864@127.0.0.1:3306/flask1?charset=utf8'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
manager = Manager(app)
# 第一个参数是flask实例,第二个参数SQLAlchemy实例
Migrate(app, db)
#manager是Flask-Script的实例,这条语句在flask-Script中添加一个db命令
manager.add_command("db", MigrateCommand)
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
users = db.relationship('User', backref='role', lazy='dynamic')
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(64), unique=True, index=True)
username = db.Column(db.String(64), unique=True, index=True)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
password_hash = db.Column(db.String(128))
class Food(UserMixin, db.Model):
__tablename__ = 'food'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
addcol = db.Column(db.String(64))
addcol1 = db.Column(db.String(64))
# db.create_all()
@app.route("/")
def index():
return "index"
if __name__ == '__main__':
manager.run()
py

运行Python脚本app.py db init以启动数据库的初始化过程。其中'db'指定了从第24行定义的设置中获取名字。您也可以选择将其重命名为任意其他名称以适应项目需求。该操作将会生成一个名为'migrations'的目录并包含所有的迁移文件。虽然这一步成功地创建了迁移存储库(即migrations),但并未完成表结构的实际创建工作。由于之前已经运行过一次此初始化操作,默认配置已被应用,请确保当前配置与预期一致。

后,看到生成migrations

2、创建迁移脚本
该脚本包含两个功能模块,
upgrade() 功能负责将修改应用至数据库,
而 downgrade() 功能则用于删除相关修改。
基于模型架构与实际数据库状态自动生成相应功能,
对比可能存在的遗漏情况仍需人工核验
:python app.py db migrate -m 'XXX注释'

在执行该操作后,在migrations文件夹中增加了新的迁移版本文件,并未生成对应的表

文件内容如下

3、更新数据库
更新数据库命令:python app.py db upgrade

在数据库中可以看到表已成功创建。同时,在数据库中建立了alembic_version表,并似乎是用于版本控制的。

总结

一点小坑和心得
一个大小写错误,查了半小时
不要看到错误就复制去百度搜,得自己阅读一下错误信息啊
而且,不要总是忽略warning,有时候warning也很重要啊。。

