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>

 

posted on 2020-06-18 16:42  过来啊小莲  阅读(292)  评论(0编辑  收藏  举报

导航