Flask-Migrate是一个扩展,使用Alembic处理Flask应用程序的SQLAlchemy数据库迁移。数据库操作通过Flask命令行界面或Flask-Script扩展提供。
- 安装
pip install Flask-Migrate
- 处理数据库迁移示例
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
生成初始迁移
flask db migrate
迁移应用于数据库
flask db upgrade
每次数据库模型更改时重复migrate和upgrade命令
要在另一个系统中同步数据库,只需从源代码管理中刷新迁移文件夹并运行upgrade命令。
查看所有可用命令
flask db –help
注意:必须在FLASK_APP环境变量中设置应用程序脚本,以便所有上述命令起作用。
- 使用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 = 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()
假设上述代码保存在manage.py文件,可以使用如下命令代替上述命令
python manage.py db init
python manage.py db migrate
python manage.py db upgrade
python manage.py db --help
- 配置回调
有时,应用程序需要将自己的设置动态插入到Alembic配置中。configure在读取配置之后以及使用之前,将调用使用回调修饰的函数。该函数可以修改配置对象,或者用另一个替换它。
可以通过装饰多个函数来定义多个配置回调。
@migrate.configure def configure_alembic(config): # 修改配置对象 return config
- 多数据库支持
Flask-Migrate可以与Flask-SQLAlchemy 的绑定功能集成 ,从而可以跟踪与应用程序关联的多个数据库的迁移。
要创建多个数据库迁移存储库,请将该–multidb参数添加到该init命令:
flask db init –multidb
使用此命令,将设置迁移存储库以跟踪主数据库以及SQLALCHEMY_BINDS
配置选项中定义的任何其他数据库上的迁移。
- 命令参考
使用标准Flask命令行界面初始化扩展
Flask-Migrate也可以使用init_app方法进行初始化。
from flask_migrate import Migrate migrate = Migrate(app, db)
使用Flask-Script命令行界面初始化扩展
from falsk_script import Manager from flask_migrate import Migrate, MigrateCommand migrate = Migrate(app, db) manager.add_command('db', MigrateCommand)
- 可用命令列表
flask db --help
显示可用命令的列表。flask db init [--multidb]
初始化应用程序的迁移支持。可选项--multidb
允许为配置为Flask-SQLAlchemy绑定的多个数据库进行迁移。flask db revision [--message MESSAGE] [--autogenerate] [--sql] [--headHEAD] [--splice] [--branch-label BRANCH_LABEL] [--version-pathVERSION_PATH] [--rev-id REV_ID]
创建一个空的修订脚本。需要使用升级和降级更改手动编辑脚本。有关如何编写迁移脚本的说明,请参阅Alembic的文档。可以包含可选的迁移消息。flask db migrate [--message MESSAGE] [--sql] [--head HEAD] [--splice][--branch-label BRANCH_LABEL] [--version-path VERSION_PATH] [--rev-idREV_ID]
相当于。迁移脚本将填充自动检测到的更改。应该检查和编辑生成的脚本,因为不能自动检测所有类型的更改。此命令不会对数据库进行任何更改,只需创建修订脚本。revision --autogenerate
flask db edit <revision>
使用$ EDITOR编辑修订脚本。flask db upgrade [--sql] [--tag TAG] [--x-arg ARG] <revision>
升级数据库。如果revision
没有给出则"head"
假定。flask db downgrade [--sql] [--tag TAG] [--x-arg ARG] <revision>
降级数据库。如果revision
没有给出则-1
假定。flask db stamp [--sql] [--tag TAG] <revision>
将数据库中的修订设置为作为参数给出的修订,而不执行任何迁移。flask db current [--verbose]
显示数据库的当前版本。flask db history [--rev-range REV_RANGE] [--verbose]
显示迁移列表。如果未给出范围,则显示整个历史记录。flask db show <revision>
显示给定符号表示的修订版本。flask db merge [--message MESSAGE] [--branch-label BRANCH_LABEL] [--rev-id REV_ID] <revisions>
合并两个修订版。创建新的修订文件。flask db heads [--verbose] [--resolve-dependencies]
在修订脚本目录中显示当前可用的头。flask db branches [--verbose]
显示当前分支点。
- 所有命令还采用指向包含迁移脚本的目录的选项。如果省略此参数,则使用的目录是。
--directory DIRECTORY
migrations
- 默认目录也可以指定为构造函数的
directory
参数Migrate
。 --sql
多个命令中的选项执行“离线”模式迁移。而不是执行数据库命令,而是将需要执行的SQL语句打印到控制台。- 有关这些命令的详细文档可以在Alembic的命令参考页面中找到。