首页 > 解决方案 > 数据库为只读时中止连接(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

我想以某种方式检测到这一点并关闭与这些节点的连接,以便任何写入操作都能成功。这可能吗?

标签: pythonpostgresqlflasksqlalchemyflask-sqlalchemy

解决方案


您可以将该错误类导入您的模块,然后在 try-except 块中使用它:

from psycopg2.errors import ReadOnlySqlTransaction

try:
    # your main stuff here
except ReadOnlySqlTransaction:
    # terminate the connection

推荐阅读