使用flask-migrate with flask-script和application factory

ETK*_*ETK 6 flask flask-migrate flask-script

我正在构建烧瓶应用程序并且这次决定尝试应用工厂方法,但是遇到了烧瓶迁移的麻烦并且无法找出简单的解决方案.

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

manage.py:

manager = Manager(create_app)
manager.add_option("-c", "--config", dest="config_module", required=False)
Run Code Online (Sandbox Code Playgroud)

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

with manager.app.app_context():
    migrate = Migrate(current_app, db)
    manager.add_command('db', MigrateCommand)
Run Code Online (Sandbox Code Playgroud)

但是还没有创建应用实例,所以它失败了

我知道我可以在环境变量中传递config并在创建管理器实例之前创建应用程序,但是如何使用管理器选项呢?

Mig*_*uel 18

当您使用--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)
Run Code Online (Sandbox Code Playgroud)

app.py(或者你的app工厂模块被调用)

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
Run Code Online (Sandbox Code Playgroud)