1、flask_migrate简介

在实际的开发环境中,经常会发生数据库修改的行为。一般我们修改数据库不会直接手动的去修改,而是去修改ORM对应的模型,然后再把模型映射到数据库中。这时候如果有一个工具能专门做这种事情,就显得非常有用了,而flask-migrate就是做这个事情的。flask-migrate是基于Alembic进行的一个封装,并集成到Flask中,而所有的迁移操作其实都是Alembic做的,它能跟踪模型的变化,并将变化映射到数据库中。
2、一个小例子:通过flask_migrate在数据库中映射user表,包含id, name, age三个字段
创建config.py文件

  1. USERNAME = "root"
  2. PASSWORD = "147258"
  3. DATABASE = "part"
  4. PORT = 3306
  5. HOSTNAME = "127.0.0.1"
  6. ENGINE = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
  7. SQLALCHEMY_DATABASE_URI = ENGINE
  8. SQLALCHEMY_TRACK_MODIFICATIONS = False
  9. DEBUG = True
  10. TEMPLATES_AUTO_RELOAD = True

为了防止相互导入创建,exts.py文件

  1. from flask_sqlalchemy import SQLAlchemy
  2. # 没有导入app
  3. db = SQLAlchemy()

创建主入口文件flask_sqlalchemy_dome.py
通过init_app方法,由于这是导入的所以之前的db = SQLALchemy(app)变成了db.init_app(app)

  1. from flask import Flask
  2. from exts import db
  3. import config
  4. app = Flask(__name__)
  5. app.config.from_object(config)
  6. # 通过init_app方法,由于这是导入的所以之前的db = SQLALchemy(app)变成了db.init_app(app)
  7. db.init_app(app)
  8. @app.route("/")
  9. def home():
  10. return "首页"
  11. if __name__ == '__main__':
  12. app.run()

创建Modulars.py用来存放模型

  1. from exts import db
  2. class User(db.Model):
  3. __tablename__ = "user"
  4. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  5. name = db.Column(db.String(10), nullable=False)
  6. age = db.Column(db.Integer)

创建migrate_dome.py用来映射数据库

  1. from flask_script import Manager
  2. from flask_migrate import Migrate, MigrateCommand
  3. from flask_sqlalchemy_dome import app
  4. from exts import db
  5. # 映射哪个模型,就把那个模型导入进来
  6. from Modulars import User
  7. manage = Manager(app)
  8. Migrate(app, db)
  9. manage.add_command("db", MigrateCommand)
  10. if __name__ == '__main__':
  11. manage.run()

要让Flask-Migrate能够管理app中的数据库,需要使用Migrate(app,db)来绑定app和数据库
相关文件如下:
image.png


当然导入flask_script的作用是能够让我们可以在命令行中进行操作
第一步,初始化(cd 文件夹路径, python migrate_dome.py db init
通过初始化,会生成一个迁移文件夹-migrations文件夹,其中存放着相关的配置和支持文件
第二步,添加当前模型( python migrate_dome.py db migrate)
此时会在migrations文件夹文件夹中生成versions文件夹,用来存放当前的模型
image.png
在数据库中生成alembic_version,用来记录模型
image.png
第三步,把迁移文件中对应的数据库操作,真正的映射到数据库中(python migrate_dome.py db upgrade)**
此时数据库真正的映射到了数据库中
相关的命令行执行图:
image.png
执行后文件的变化:
image.png

2、实现数据库的更新

小例子:将上述例子中的user表中添加gender字段
image.png
第一步,在存放模型的Modulars.py文件中,进行修改

  1. from exts import db
  2. class User(db.Model):
  3. __tablename__ = "user"
  4. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  5. name = db.Column(db.String(10), nullable=False)
  6. age = db.Column(db.Integer)
  7. # 新增gender字段
  8. gender = db.Column(db.Enum("男", "女"))

第二步,命令行中,执行python migrate_dome.py db migrate和python migrate_dome.py db upgrade命令
不需要初始化
image.png
**