如何在Python中检测数据库查询超时?
如何在Python中检测数据库查询超时?
嗨,我懂你的痛点!当你在MySQL里设置了max_execution_time来终止慢查询后,Python这边居然没主动抛出异常或给出提示,确实让人摸不着头脑。其实MySQL服务器在终止超时查询后,会留下一个隐藏的警告信息,我们可以通过以下方法捕捉到它:
核心思路:查询执行后检查服务器警告
MySQL在因max_execution_time终止查询时,会生成一条代码为1317的警告(提示内容类似“Query execution was interrupted”)。我们只需要在目标查询执行完成后,立刻查询服务器的警告列表,就能判断是否发生了超时。
通用实现(适配大多数MySQL Python驱动)
执行完你的业务查询后,马上执行SHOW WARNINGS语句来获取警告信息:
self.db_cursor = self.db_conn.cursor(buffered=False) self.db_cursor.execute(query) # 关键步骤:执行完查询后立即检查警告 self.db_cursor.execute("SHOW WARNINGS") warnings = self.db_cursor.fetchall() # 遍历警告,检测超时对应的代码1317 for warning in warnings: # 警告元组结构为 (警告级别, 错误代码, 提示信息) if warning[1] == 1317: # 这里添加你的用户提示逻辑 print("抱歉,查询执行超时已被终止,请尝试优化查询或调整超时时间!")
更简洁的方式(针对pymysql驱动)
如果你用的是pymysql,它提供了直接获取警告的方法show_warnings(),不用手动执行SQL:
self.db_cursor.execute(query) # 直接调用驱动内置方法获取警告 warnings = self.db_cursor.show_warnings() for warn in warnings: if warn[1] == 1317: # 处理超时逻辑 print("查询超时被终止,请稍后再试或优化查询语句!")
注意事项
- 一定要在目标查询执行后立刻检查警告,后续执行的其他SQL会覆盖当前的警告列表,导致无法捕捉到超时信息。
- 如果你同时有其他类型的警告,记得只针对代码1317的情况做超时判断,避免误触发。
备注:内容来源于stack exchange,提问作者pecks
相关产品推荐
相关产品推荐

