使用 Flask-Migrate 来迁移数据库

使用 Flask-SQLAlchemy[1] 的童靴,可能会经常改动某些数据模型的属性,当然有更好的选择,那就是 Flask-Migrate[2]

安装

安装我觉得其实可以忽略这一步;),肯定用 pip

pip install Flask-Migrate

使用

有两个方式可以使用 Flask-Migrate ,我一一介绍

使用 Flask

下面是官方例子

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'

db = SQLAlchemy(app)
migrate = Migrate(app, db)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128))

通过三个命令即可进行迁移

$ flask db init

init命令会初始化一个迁移脚本的版本管理仓库至migrations目录

$ flask db migrate

执行migrate命令后会生成所有的迁移脚本

$ flask db upgrade

最后upgrade命令就是迁移的操作

使用 Flask-Script

Flask-Script[3]Flask 的一个扩展包,用来使用扩展脚本

下面是官方例子

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'

db = SQLAlchemy(app)
migrate = Migrate(app, db)

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()

它最大的不同就是让一个名为 manager 的实例来运行,它其实理解为 加了扩展的Flask实例 而已,但是缺点是如果使用 Gunicorn 启动会有一些问题,解决方法[4]

使用 Flask-Script 和直接使用 Flask 来迁移的命令很相似

$ python manage.py db init
$ python manage.py db migrate
$ python manage.py db upgrade

其中需要注意的就是以 python 文件方式来处理迁移脚本


  1. Flask-SQLAlchemy Source ↩︎

  2. Flask-Migrate Source ↩︎

  3. Flask-Script Source ↩︎

  4. How to use Flask-Script and Gunicorn ↩︎