如何正确更改 Flask-SQLAlchemy 中的数据库 URI 以进行故障转移处理?

问题描述 投票:0回答:1
我正在使用 Flask-SQLAlchemy 连接到 MariaDB 数据库。我已在 .env 文件中配置了数据库 URI。我想实现一个故障转移机制,以便如果与 MariaDB 的连接失败,它会切换到 SQLite 数据库以进行测试。

这是我用来设置数据库的代码:

#uri 1
app.config['SQLALCHEMY_DATABASE_URI'] = config('SQLALCHEMY_DATABASE_URI')

migrate = Migrate()

db.init_app(app)
migrate.init_app(app, db)

with app.app_context():
    try:
        db.create_all()
    except Exception as e:
        app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///database_temp/database.db" #uri2 for failover
        db.engine.dispose()
        migrate.init_app(app, db)
        db.create_all()

注意:我的变量 db = SQLAlchemy() 位于名为 models 的文件夹中。此外,当我的应用程序上下文尝试使用 db.create_all() 时,会发生异常,但在异常处理中,它仍然使用相同的 URI,或者在其他情况下,它表示连接已存在,我应该使用该连接烧瓶。

我尝试过的:我配置了 SQLALCHEMY_DATABASE_URI 以在 MariaDB 服务器连接失败时切换到 SQLite。我还调用 db.engine.dispose() 来释放当前引擎,并在更改 URI 后重新初始化 SQLAlchemy 和 Migrate。

我期望发生的情况:我期望如果与 MariaDB 服务器的连接失败,应用程序将切换到使用 SQLALCHEMY_DATABASE_URI 中指定的 SQLite,并且 db.create_all() 将使用新的 SQLite 数据库。

实际结果:即使在异常处理中 URI 已更改为 SQLite,应用程序仍然尝试连接到 MariaDB uri 并给出错误,指出连接失败、或已存在或应使用现有连接。

python database flask sqlalchemy flask-sqlalchemy
1个回答
0
投票

初始化 SQLAlchemy 对象时,它会创建与 SQLALCHEMY_DATABASE_URI 配置中指定的数据库的连接。即使您稍后更改

SQLALCHEMY_DATABASE_URI
,现有连接仍保持活动状态。 为了实现您所描述的故障转移机制,您需要使用新的 URI 重新创建 SQLAlchemy 对象。 像这样的东西:

#uri 1
app.config['SQLALCHEMY_DATABASE_URI'] = config('SQLALCHEMY_DATABASE_URI')

db = None
try:
    db = SQLAlchemy(app)
    migrate = Migrate()
    migrate.init_app(app, db)
    with app.app_context():
        db.create_all()
except Exception as e:
    # Failover to SQLite
    app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///database_temp/database.db"  # uri2 for failover
    db = SQLAlchemy(app)  # Recreate the SQLAlchemy object with the new URI
    migrate = Migrate()
    migrate.init_app(app, db)
    with app.app_context():
        db.create_all()
© www.soinside.com 2019 - 2024. All rights reserved.