#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 并给出错误,指出连接失败、或已存在或应使用现有连接。
初始化 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()