python - 数据库为只读时中止连接(Flask/SQLAlchemy)
问题描述
我面临以下问题:
我们已经为我们的登台环境配置了故障转移数据库节点。测试时,有时会发生故障转移,Flask 会保持与某些节点的开放连接,这些节点现在是只读的——然后任何写入操作都会失败:
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1277, in _execute_context
cursor, statement, parameters, context
File "/usr/local/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 608, in do_execute
cursor.execute(statement, parameters)
File "/usr/local/lib/python3.7/site-packages/elasticapm/instrumentation/packages/dbapi2.py", line 210, in execute
return self.trace_sql(self.wrapped_.execute, sql, params)
File "/usr/local/lib/python3.7/site-packages/elasticapm/instrumentation/packages/dbapi2.py", line 244, in _trace_sql
result = method(sql, params)
psycopg2.errors.ReadOnlySqlTransaction: cannot execute DELETE in a read-only transaction
我想以某种方式检测到这一点并关闭与这些节点的连接,以便任何写入操作都能成功。这可能吗?
解决方案
您可以将该错误类导入您的模块,然后在 try-except 块中使用它:
from psycopg2.errors import ReadOnlySqlTransaction
try:
# your main stuff here
except ReadOnlySqlTransaction:
# terminate the connection
推荐阅读
- java - Java 3级嵌套列表到3级嵌套映射
- matrix - 为什么我的矩阵在乘以 A *B 后显示随机数?
- swift - Flutter 中的 NS Notification Object (Swift) 有什么相似之处?
- django - 添加额外字段,允许用户选择额外字段的类型
- sql-server-2019 - 需要在 SQL Server 2019 中使用前一行值(向下填充)填充空单元格
- python - 在函数中的任何其他内容之前写入文件
- ads - 如何使用旧版本的 google AdWords API 而不是带有新开发者令牌的 Google Ads Api?
- android-auto - Android Auto“instrumentcluster”使用
- django - 你能将 Django Simple JWT 与 Oauth2 Azure 结合起来吗?
- laravel-backpack - 如何在 Laravel Backpack 中添加导出按钮