【问题标题】:Flask-migrate upgrade fails because the application needs to run code that modifies the db on startupFlask-migrate 升级失败,因为应用程序需要在启动时运行修改数据库的代码
【发布时间】:2022-11-11 10:01:49
【问题描述】:

我有一个需要在启动时运行代码的 Flask 应用程序。就我而言,它检测可用的云资源并将其写入数据库中的表中。

问题是,当我运行flask db upgrade 时,flask-migrate 会执行应用程序启动代码,包括尝试写入 db 表的代码。由于迁移本身是创建表的原因,因此该表还不存在,迁移失败。

这是代码,删除了不相关的部分:

def create_app():
    app = Flask(__name__, static_url_path=None)
    with app.app_context():
        db = set_up_database_connection()

    Migrate(app, db)
    
    # This is what fails because the table doesn't exist yet
    run_startup_tasks()

    @app.get('/')
    def health_check():
        return 'OK'

    app.logger.info("Application created.")
    return app

我使用@app.before_first_request 注释做了一个临时解决方法。使用解决方法,启动代码在第一个请求通过之前运行。但是,这并不理想,因为这会导致对应用程序的第一次请求需要很长时间。

 @app.before_first_request
 def perform_startup_tasks():
     run_startup_tasks()

如何在不破坏烧瓶迁移的情况下运行需要数据库的启动任务?

【问题讨论】:

    标签: python flask flask-migrate


    【解决方案1】:

    我最终通过创建一个单独的文件来解决这个问题,该文件运行启动任务:

    app = Flask(__name__, static_url_path=None)
    with app.app_context():
        db = set_up_database_connection()
    
    run_startup_tasks()
    

    该文件在主应用程序运行之前和迁移运行之后运行:

    flask db upgrade && python run_startup_tasks.py && flask run
    

    这解决了问题,因为主应用程序(flask-migrate 使用)不运行启动任务。它在单独的脚本中运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多