原文地址

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 DIRECTORYmigrations
  • 默认目录也可以指定为构造函数的directory参数Migrate
  • --sql多个命令中的选项执行“离线”模式迁移。而不是执行数据库命令,而是将需要执行的SQL语句打印到控制台。
  • 有关这些命令的详细文档可以在Alembic的命令参考页面中找到

发表回复