首页 > 解决方案 > 如何设置 Flask-SQLAlchemy 在启动时优雅地管理 PostgreSQL 不可用

问题描述

我有一个烧瓶 API,一切正常,一切都被 Dockerized 用于本地测试,这是烧瓶init .py:

import os
from os.path import join, dirname

import cloudinary
import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration
from dotenv import load_dotenv
from flask import Flask
from flask_cors import CORS
from flask_marshmallow import Marshmallow
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address

cors = CORS()
marsh = Marshmallow()
db = SQLAlchemy()
migrate = Migrate()
limiter = Limiter(key_func=get_remote_address)

from deblurrer.api import api_bp


def create_app(config='flask_config.Production'):
    """
    Init core application.

    Args:
        config: can be import to object or the object itself

    Returns:
        Application instance
    """
    # Load .env vars
    dotenv_path = join(dirname(dirname(__file__)), '.env')
    load_dotenv(dotenv_path)

    # Setup default production config
    app = Flask('deblurrer', instance_relative_config=True)
    app.config.from_object(config)

    # Sentry config
    sentry_sdk.init(
        dsn=os.environ.get('SENTRY_DNS'),
        integrations=[FlaskIntegration()]
    )

    # Init Cloudinary credentials
    cloudinary.config(
        cloud_name = os.environ.get('CLOUDINARY_CLOUD_NAME'),
        api_key = os.environ.get('CLOUDINARY_API_KEY'),
        api_secret = os.environ.get('CLOUDINARY_API_SECRET'),
    )

    # Init Plugins
    cors.init_app(app)
    marsh.init_app(app)
    db.init_app(app)
    migrate.init_app(app, db)
    limiter.init_app(app)

    with app.app_context():
        app.register_blueprint(api_bp, url_prefix='/api')

        # Create tables for models
        db.create_all()

        return app

当我这样做docker-compose up时,PostgreSQL 容器不会在 Flask API 容器之前启动,这是正常和预期的。建议准备 API 以在任何时间(包括开始时间)优雅地管理数据库不可用性。

我的问题是,如何在我的烧瓶应用程序上做到这一点?似乎这必须在初始化 Flask-SQLAlchemy 时在init .py 上完成,但我不知道怎么做,我试图做一些研究,但没有任何明显的出现,你能帮帮我吗?

谢谢!

标签: pythonpostgresqlflasksqlalchemyflask-sqlalchemy

解决方案


只要继续努力...

# Connect to database
tries = 5
while tries > 0:
    try:
        db.create_all()
        tries = 0
    except:
        tries += -1
        print('Failed to connect to database. Waiting and then trying again (try countdown: %s)' % tries)
        sleep(10)  # Wait a bit until database is loaded

推荐阅读