每次我重新开始 mysql
服务,我的应用程序在任何查询中收到以下错误:
result = self._query(query)
File "/usr/local/lib/python3.6/site-packages/pymysql/cursors.py", line 328, in _query
conn.query(q)
File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 516, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 727, in _read_query_result
result.read()
File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 1066, in read
first_packet = self.connection._read_packet()
File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 656, in _read_packet
packet_header = self._read_bytes(4)
File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 702, in _read_bytes
CR.CR_SERVER_LOST, "Lost connection to MySQL server during query")
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') [SQL: ...] [parameters: {...}] (Background on this error at: http://sqlalche.me/e/e3q8)
之后的任何查询都将照常成功。
这只是一个常见的用例,例如,一般来说,我可能希望根据错误重试任何查询。
有没有什么方法可以在较低级别上捕获并重试查询 sqlalchemy
应用程序编程接口?做尝试或习惯 query
方法在我的代码中是不合理的,因为我使用它太多次,它不可维护。
4条答案
按热度按时间qf9go6mv1#
非常感谢这个片段,我不得不对它进行一些修改,以便直接使用sqlalchemy.orm:如果它对任何人都有用的话。。
对于用法:将选项传递给sessionmaker:
nwlls2ji2#
我不得不稍微调整它,使之与postgres一起工作,它有一个不同的错误消息。我知道这个问题是有标签的
mysql
,但是通过搜索发现了这个问题(并且有完全相同的问题),所以可能会帮助某人。我还得接住
StatementError: (sqlalchemy.exc.InvalidRequestError) Can't reconnect until invalid transaction is rolled back
在重试之前 flask 就爆炸了。最后我让它指数退避,因为为什么不呢?
x7yiwoj43#
显然地
sqlalchemy
有一个很好的自定义查询类的选项,这正是我所需要的。类实现:
用法:
62lalag44#
sqlalchemy还允许您聆听
engine_connect
在connection
已创建。这使得实现悲观断开处理的自定义逻辑成为可能下面的代码段实现了指数退避以供重试。它取自apache airflow的sqlalchemy utils:http://airflow.apache.org/docs/1.10.3/_modules/airflow/utils/sqlalchemy.html