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 = 3306HOSTNAME = "127.0.0.1"ENGINE = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"SQLALCHEMY_DATABASE_URI = ENGINESQLALCHEMY_TRACK_MODIFICATIONS = FalseDEBUG = TrueTEMPLATES_AUTO_RELOAD = True
为了防止相互导入创建,exts.py文件
from flask_sqlalchemy import SQLAlchemy# 没有导入appdb = SQLAlchemy()
创建主入口文件flask_sqlalchemy_dome.py
通过init_app方法,由于这是导入的所以之前的db = SQLALchemy(app)变成了db.init_app(app)
from flask import Flaskfrom exts import dbimport configapp = 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 dbclass 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 Managerfrom flask_migrate import Migrate, MigrateCommandfrom flask_sqlalchemy_dome import appfrom exts import db# 映射哪个模型,就把那个模型导入进来from Modulars import Usermanage = 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 dbclass 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命令
不需要初始化
**
