Flask-migrate
在实际的开发环境中,经常会发生数据库修改的行为。一般我们修改数据库不会直接手动的去修改,而是去修改ORM对应的模型,然后再把模型映射到数据库中。这时候如果有一个工具能专门做这种事情,就显得非常有用了,而flask-migrate就是做这个事情的。
flask-migrate是基于Alembic进行的一个封装,并集成到Flask中,而所有的迁移操作其实都是Alembic做的,他能跟踪模型的变化,并将变化映射到数据库中。
- 使用前需要安装flask-migrate
![]()
- 实际运用
- 创建一个文件夹project,在文件夹中创建两个py文件
1 2 3 4 5 6 7 8 9 10 | config.py文件 HOSTNAME = '127.0.0.1' DATABASE = 'demo' PORT = 3306 USERNAME = 'root' PASSWORD = 'root' DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE) SQLALCHEMY_DATABASE_URI = DB_URL SQLALCHEMY_TRACK_MODIFICATIONS = False |
1 2 3 4 5 6 7 8 9 10 11 12 | flask_app.py文件 from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) @app.route('/') def index(): return '这是首页' if __name__ =='__mian__': app.run(debug=True) |
- 然后我们在flask_app文件中倒入config文件,并且加载配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from flask import Flask from flask_sqlalchemy import SQLAlchemy #倒入配置文件 import config app = Flask(__name__) #加载配置文件 app.config.from_object(config) @app.route('/') def index(): return '这是首页' if __name__ =='__mian__': app.run(debug=True) |
- 在创建一个models.py文件存放模型
1 2 3 4 5 6 7 8 9 10 11 | #从上面的flask_app(view文件)中倒入db from flask_app import db class User(db.Model): __tablename__ = 'project_user' id = db.Column(db.Integer,primary_key = True,autoincrement = True) name = db.Column(db.String(50)) email = db.Column(db.String(50)) password = db.Column(db.String(50)) db.create_all() |
- 我们尝试一下添加数据然后运行代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | from flask import Flask from flask_sqlalchemy import SQLAlchemy import config #导入User from models import User app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app) #添加数据 user = User(name='zaaaacki',email = '[email protected]',password = '123456') db.session.add(user) db.session.commit() @app.route('/') def index(): return '这是首页' if __name__ =='__mian__': app.run(debug=True) |
- 这样会报错给我们
,因为这两个文件往复运作,互相导入,导致出错, - 那么我们再添加一个文件呢
- 再创建一个asd.py文件
1 2 3 4 | asd.py from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() |
- 在asd文件中创建我们使用的db,既然我们创建好了db,那么我们就不从flask_app文件中倒入了,直接从asd文件中倒入db
这里把flask_app 修改为asd
- 我们的view视图里面还需要倒入我们新创建的db
但是现在又出现了一个问题,我们创建的db没有app和flask关联,怎么呢
- 我们通过init_app方法来给db传入app属性

- 我们解决掉了循环导入的问题,现在我们需要映射数据库了,用到migrate
- 穿件一个manage.py文件
- 导入库
1 2 3 4 | from flask_script import Manager from flask_migrate import Migrate,MigrateCommand from asd import db from flask_app import app |
- 接下来需要映射那个模型到数据库,我们就导入那个
1 2 3 4 5 6 7 8 9 | #创建实例和app绑定 manage = Manager(app) 把app和db倒入进来让他们与flask产生联系 Migrate(app,db) 调用方法,映射数据库 manage.add_command('db',MigrateCommand) if __name__ =='__main__': manage.run() |
- 我们现在去命令行中进行操作
- 首先我们要初始化

- 接下来进行文件的迁移

- 打开数据库发现多了一个表格

他是用来存放我们的版本信息的
我们可以看到pycharm中生成了一个迁移文件
这是一个版本号,我们加下来要把这个版本号成功的放入到我们的数据库中,就算迁移成功- 然后输出这个

- 但是我在这里出现了一个问题

- 后来查资料发现应该这么解决
在db.inti_app前加一个ad.app=app
- 再在命令行中输入刚才的代码
- 运行成功后打开数据库可以发现我们表格创建成功

- 并且版本号也添加成功

- 但是我们这么复杂的操作有啥用呢
- 我们在表格中在添加一个age列

- 我们不删除表格,我们进入到命令行操作,进行一次迁移


- 输入两段代码
- 然后打开数据库发现添加了age字段

- migrate的作用就显示出来了,我们不用删除表格就添加了age列
- 现在我们是不能直接添加数据的,会报错的
- 那么我们怎么添加数据呢
- 我们要在manage文件中使用option装饰器,添加我们需要的数据

- 然后再命令行处输入
![]()
- 打开数据库发现数据添加成功


我们可以看到pycharm中生成了一个迁移文件
这是一个版本号,我们加下来要把这个版本号成功的放入到我们的数据库中,就算迁移成功