将 flask-migrate 与 flask-script 和应用程序工厂一起使用

using flask-migrate with flask-script and application factory

我正在构建 Flask 应用程序,这次决定尝试应用程序工厂方法,但是遇到了 flask-migrate 的麻烦,无法找到简单的解决方案。

请注意,我想将配置位置作为选项传递给脚本

manage.py:

manager = Manager(create_app)
manager.add_option("-c", "--config", dest="config_module", required=False)

然后我需要创建迁移实例并向管理器添加命令:

with manager.app.app_context():
    migrate = Migrate(current_app, db)
    manager.add_command('db', MigrateCommand)

但应用程序实例尚未创建,因此失败

我知道我可以在环境变量中传递配置并在创建管理器实例之前创建应用程序,但是如何使用管理器选项来做到这一点?

当您使用 --config 选项时,您必须使用应用程序工厂函数,因为此函数将配置作为参数获取,并允许您使用正确的配置创建应用程序。

由于您有一个应用程序工厂,因此您必须对所有扩展程序使用延迟初始化。您在不传递任何参数的情况下实例化您的扩展,然后在您创建应用程序后在您的应用程序工厂函数中,您在所有扩展上调用 init_app,传递应用程序和数据库,现在您已经有了它们。

MigrateCommand 与此完全分开,您可以将其添加到 Manager 而无需创建应用程序和数据库实例。

示例:

manage.py:

from app import create_app
from flask_migrate import MigrateCommand, Manager

manager = Manager(create_app)
manager.add_option("-c", "--config", dest="config_module", required=False)
manager.add_command('db', MigrateCommand)

app.py(或者您的应用工厂模块的名称)

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

db = SQLAlchemy()
migrate = Migrate()

def create_app(config):
    app = Flask(__name__)
    # apply configuration
    # ...

    # initialize extensions
    db.init_app(app)
    migrate.init_app(app, db)

    return app