一. 插件介绍
1. 在迭代开发过程中,当数据库中数据表发生变化时,需要进行数据库的迁移工作。
2. Flask-Migrate插件的作用:在不破坏数据库已有数据的情况下更新数据库的表结构。
3. Flask-Migrate基于Alembic(SQLAlchemy作者编写的数据库迁移工具)开发,并提供一些flask db命令来简化迁移工作。
4. Flask-Migrate插件通常会结合Flask-Script插件一起使用
二. 插件安装
pip install flask
pip install flask-sqlalchemy
pip install flask-migrate pip install flask-script
三. 插件用法
3.1 Flask-Migrate插件的基本使用
3.1.1 创建app.py文件
# -*- coding: utf-8 -*- # @Time : 2020/11/21 11:10 # @Author : chinablue # @File : app.py from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app1.db' db = SQLAlchemy(app) Migrate(app, db) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(128)) if __name__ == '__main__': app.run()
3.1.2 创建迁移仓库
>>> flask db init
3.1.2 创建迁移脚本
>>> flask db migrate
3.1.3 更新数据库
>>> flask db upgrade
3.2 与Flask-Script插件结合使用
3.2.1 创建manager.py文件
# -*- coding: utf-8 -*- # @Time : 2020/11/21 12:14 # @Author : chinablue # @File : manager.py from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate, MigrateCommand from flask_script import Manager app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app2.db' db = SQLAlchemy(app) # 初始化Flask-Migrate插件 migrate = Migrate(app, db) # 将Flask-Migrate插件的实例对象注册到Flask-Script插件中 manager = Manager(app) manager.add_command('db', MigrateCommand) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(128)) if __name__ == '__main__': manager.run()
3.2.2 创建迁移仓库
>>> python manager.py db init Creating directory D:demomigrations ... done Creating directory D:demomigrationsversions ... done Generating D:demomigrationsalembic.ini ... done Generating D:demomigrationsenv.py ... done Generating D:demomigrationsREADME ... done Generating D:demomigrationsscript.py.mako ... done Please edit configuration/connection/logging settings in 'D:\demo\migrations\alembic.ini' before proceeding.
注意事项:
1)db init命令一个项目中只需要执行一次
2)执行db init命令后,项目根目录下会生成一个migrations文件夹
3)当你单独使用Alembic进行数据迁移时,需要编写一些配置文件,而db init命令则会帮你自动生成好这些配置文件。
3.2.3 创建迁移脚本
>>> python manager.py db migrate INFO [alembic.runtime.migration] Context impl SQLiteImpl. INFO [alembic.runtime.migration] Will assume non-transactional DDL. INFO [alembic.autogenerate.compare] Detected added table 'user' Generating D:demomigrationsversions11565ab73ab5_.py ... done
注意事项:
1)为创建的迁移脚本指定注释,使用-m参数:python manage.py db migrate -m "comment 123"
2)自动创建的迁移脚本会根据model模型中的内容与当前数据库中的内容进行对比,进而生成迁移脚本
3)因为Alembic无法检测到你对model模型做出的所有更改,所以在一些场景下,自动创建的迁移脚本不一定是完全正确的,需要自行对其检查校验。
3.2.4 更新数据库
>>> python manager.py db upgrade INFO [alembic.runtime.migration] Context impl SQLiteImpl. INFO [alembic.runtime.migration] Will assume non-transactional DDL. INFO [alembic.runtime.migration] Running upgrade -> 11565ab73ab5, empty message