Flask-Migrate
Flask-Migrate 插件提供了和 Django 自带的 migrate 类似的功能。
即 Alembic(Database migration 数据迁移跟踪记录)提供的数据库升级和降级的功能。它所能实现的效果有如 Git 管理项目代码一般。
安装 Flask-Migrate
pip install Flask-Migrate
多数情况下 Flask-Migrate 是会和命令行工具插件 Flask-Script 和数据库插件 flask_sqlalchemy 一起使用的,所有也把 Flask-Script 安装一下:
pip install Flask-Script
实例
官方文档给出的例子:
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
# 两个参数一个是 Flask 的 app,一个是数据库 db
migrate = Migrate(app, db)
# 初始化管理器
manager = Manager(app)
# 添加 db 命令,并与 MigrateCommand 绑定
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()
假设上面的代码保存在文件 manage.py
中,我们可以这样执行相关命令:
$ python manage.py db init
$ python manage.py db migrate
$ python manage.py db upgrade
$ python manage.py db --help
当然,更多情况下我们不会把代码都放到一个文件里面,我们应该建立一个 manage.py
来放置相关代码,详细源码我传到 Github 上面:https://github.com/SingleDiego/flask-migrate
查看指令 manager db 的可用选项
>>> python manage.py db
usage: Perform database migrations
Perform database migrations
positional arguments:
{init,revision,migrate,edit,merge,upgrade,downgrade,show,history,heads,branches,current,stamp}
init Creates a new migration repository
revision Create a new revision file.
migrate Alias for 'revision --autogenerate'
edit Edit current revision.
merge Merge two revisions together. Creates a new migration
file
upgrade Upgrade to a later version
downgrade Revert to a previous version
show Show the revision denoted by the given symbol.
history List changeset scripts in chronological order.
heads Show current available heads in the script directory
branches Show current branch points
current Display the current revision for each database.
stamp 'stamp' the revision table with the given revision;
don't run any migrations
optional arguments:
-?, --help show this help message and exit
初始化 DB Migrate
>>> python manage.py db init
执行该命令后会创建一个 migrations
目录,所有的更改记录文件都会被保存在该目录下。
开始第一次跟踪
>>> python manage.py db migrate -m "Initial migration"
该指令会扫描所有的 SQLAlchemy 对象,并将没有记录过的行和列记录成为一个 python 文件并保存到 migrations/versions
路径下。然后给本次扫描结果分配一个版本号。
例如,我的例子中第一个版本的版本号就是: 6c1971cccc11_initial_migration.py
,打开该文件,可以看到该文件记录了数据库的结果,比如这样:
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('user',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('name', sa.String(length=128), nullable=True),
sa.PrimaryKeyConstraint('id')
)
# ### end Alembic commands ###
根据记录文件生成数据库
>>> python manage.py db upgrade
该命令会根据 migrations/versions
路径下的文件来创建或修改数据库,生成的数据库会有一张名为 alembic_version
的表来记录数据库版本号。
回滚到某历史版本
# 获取 History ID
>>> python manage.py db history
# 回滚到某个 history
>>> python manage.py db downgrade <history_id>