英文原文链接:http://flask-migrate.readthedocs.io/en/latest/
本人水平有限,不懂之处可参阅原文
Flask-Migrate是一个扩展,使用 Alembic 处理 Flask 程序的 SQLAlchemy 数据库迁移。数据库操作通过 Flask 命令行界面或 Flask-Script 扩展来提供。
使用 pip 安装 Flask-Migrate :pip install Flask-Migrate
这是一个通过 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
需要检查和编辑迁移脚本,因为 Alembic 当前未检测到您对模型所做的每项更改。特别是,Alembic 目前无法检测表名的更改,列名的更改或匿名限制。有关限制的详细摘要可在 Alembic自动生成文档 中找到。完成后,还需要将迁移脚本添加到版本控制中。
然后,您可以将迁移应用于数据库:
$ flask db upgrade
然后每次数据库模型更改时重复 migrate 和 upgrade 命令。
要在另一个系统中同步数据库,只需从源代码管理中刷新迁移文件夹并运行该 upgrade 命令。
要查看所有可用的命令,请运行以下命令:
$ flask db --help
请注意,必须在 FLASK_APP 环境变量中设置程序脚本,以使所有上述命令起作用,这是 flask 命令行脚本所要求的。
Flask-Migrate 还支持 Flask-Script 命令行界面。这是一个通过 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):
# modify config object
return config
可以简单地通过装饰多个函数来定义多个配置回调。调用多个回调的顺序是未确定的。
Flask-Migrate 可以与 Flask-SQLAlchemy 的绑定(binds)功能集成 ,从而可以跟踪与应用程序关联的多个数据库的迁移。
要创建多个数据库迁移存储库,请将 --multidb
参数添加到该 init
命令:
$ flask db init --multidb
使用此命令,将设置迁移存储库以跟踪主数据库以及 SQLALCHEMY_BINDS 配置选项中定义的任何其他数据库上的迁移。
lask-Migrate 公开了两个类,Migrate 和 MigrateCommand。Migrate 类包含扩展的所有功能。MigrateCommand类仅在希望通过 Flask-Script 扩展公开数据库迁移命令时才使用。
以下示例使用标准 Flask 命令行界面初始化扩展:
from flask_migrate import Migrate
migrate = Migrate(app, db)
Migrate 的两个参数是应用程序实例和 Flask-SQLAlchemy 数据库实例。该 Migrate 构造还需要额外的关键字参数,这些参数传递给 Alembic 的 EnvironmentContext.configure()
方法。作为所有 Flask 扩展的标准,Flask-Migrate 也可以使用该 init_app
方法进行初始化。
使用Flask-Script的命令行界面时,扩展名初始化如下:
from flask_migrate import Migrate, MigrateCommand
migrate = Migrate(app, db)
manager.add_command('db', MigrateCommand)
初始化扩展后,一个db组将被添加到命令行选项中,其中包含几个子命令。包括Flask 命令行界面中还是manage.py 在使用 Flask-Script 创建的脚本中。以下子命令的列表都是可用的:
--multidb
允许配置为 Flask-SQLAlchemy 绑定的多个数据库进行迁移。revision --autogenerate
。迁移脚本将填充自动检测到的更改。应该检查和编辑生成的脚本,因为不能自动检测所有类型的更改。此命令不会对数据库进行任何更改,只创建修订脚本。--directory DIRECTORY
选项,该选项指向包含迁移脚本的目录。如果省略此参数,则使用的目录是 migrations
。directory
参数给 Migrate
构造函数。--sql
选项存在于多个命令中来执行“脱机”模式迁移。需要执行的SQL语句不是执行数据库命令,而是打印到控制台。Flask-Migrate 命令行界面公开的命令也可以通过从模块导入函数以编程方式访问 flask_migrate。可用的功能有:
注意:为了获得更好的脚本编写灵活性,您还可以直接使用 Alembic 的 API。