【问题标题】:using flask-migrate with flask-script and application factory使用带有烧瓶脚本和应用程序工厂的烧瓶迁移
【发布时间】:2015-07-04 13:20:30
【问题描述】:

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

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

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)

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

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

【问题讨论】:

    标签: flask flask-migrate flask-script


    【解决方案1】:

    当您使用--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
    

    【讨论】:

    • 你确定你的例子有效吗,米格尔?我在这里得到了空迁移。
    • 如果你直接使用 Alembic,你会得到有效的迁移吗?我的猜测是您的问题与 Flask-Script 设置无关。
    • @ItaloMaia 我知道这是旧的,但我也得到了空迁移。你是怎么解决这个问题的?
    猜你喜欢
    • 2021-09-02
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    相关资源
    最近更新 更多