1、flask_migrate简介
在实际的开发环境中,经常会发生数据库修改的行为。一般我们修改数据库不会直接手动的去修改,而是去修改ORM对应的模型,然后再把模型映射到数据库中。这时候如果有一个工具能专门做这种事情,就显得非常有用了,而flask-migrate就是做这个事情的。flask-migrate是基于Alembic进行的一个封装,并集成到Flask中,而所有的迁移操作其实都是Alembic做的,它能跟踪模型的变化,并将变化映射到数据库中。
2、一个小例子:通过flask_migrate在数据库中映射user表,包含id, name, age三个字段
创建config.py文件
USERNAME = "root"
PASSWORD = "147258"
DATABASE = "part"
PORT = 3306
HOSTNAME = "127.0.0.1"
ENGINE = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
SQLALCHEMY_DATABASE_URI = ENGINE
SQLALCHEMY_TRACK_MODIFICATIONS = False
DEBUG = True
TEMPLATES_AUTO_RELOAD = True
为了防止相互导入创建,exts.py文件
from flask_sqlalchemy import SQLAlchemy
# 没有导入app
db = SQLAlchemy()
创建主入口文件flask_sqlalchemy_dome.py
通过init_app方法,由于这是导入的所以之前的db = SQLALchemy(app)变成了db.init_app(app)
from flask import Flask
from exts import db
import config
app = Flask(__name__)
app.config.from_object(config)
# 通过init_app方法,由于这是导入的所以之前的db = SQLALchemy(app)变成了db.init_app(app)
db.init_app(app)
@app.route("/")
def home():
return "首页"
if __name__ == '__main__':
app.run()
创建Modulars.py用来存放模型
from exts import db
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(10), nullable=False)
age = db.Column(db.Integer)
创建migrate_dome.py用来映射数据库
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from flask_sqlalchemy_dome import app
from exts import db
# 映射哪个模型,就把那个模型导入进来
from Modulars import User
manage = Manager(app)
Migrate(app, db)
manage.add_command("db", MigrateCommand)
if __name__ == '__main__':
manage.run()
要让Flask-Migrate能够管理app中的数据库,需要使用Migrate(app,db)来绑定app和数据库
相关文件如下:
当然导入flask_script的作用是能够让我们可以在命令行中进行操作
第一步,初始化(cd 文件夹路径, python migrate_dome.py db init)
通过初始化,会生成一个迁移文件夹-migrations文件夹,其中存放着相关的配置和支持文件
第二步,添加当前模型( python migrate_dome.py db migrate)
此时会在migrations文件夹文件夹中生成versions文件夹,用来存放当前的模型
在数据库中生成alembic_version,用来记录模型
第三步,把迁移文件中对应的数据库操作,真正的映射到数据库中(python migrate_dome.py db upgrade)**
此时数据库真正的映射到了数据库中
相关的命令行执行图:
执行后文件的变化:
2、实现数据库的更新
小例子:将上述例子中的user表中添加gender字段
第一步,在存放模型的Modulars.py文件中,进行修改
from exts import db
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(10), nullable=False)
age = db.Column(db.Integer)
# 新增gender字段
gender = db.Column(db.Enum("男", "女"))
第二步,命令行中,执行python migrate_dome.py db migrate和python migrate_dome.py db upgrade命令
不需要初始化
**