python怎么捕获mysql报错

本文深入探讨了在Python脚本中遇到的mysqlserverhasgoneaway错误,详细解析了MySQLdb库中各种错误类型的捕获方法,特别是如何有效捕获与数据库连接相关的问题。
部署运行你感兴趣的模型镜像

一、前言

      最近在运行python脚本的时候,经常出现:mysql server has gone away的错误,导致脚本停止运行。只是代码里面明明已经使用try: except 这种方式来捕获mysql错误了,用的方法是:MySQLdb.ProgrammingError,但是毛用没用。 很好,很强大,那么咱们就来研究下这到底是怎么回事。

捕获代码:

try:
  cursor.execute(sql)
except MySQLdb.ProgrammingError,e:
  print e

打印不出来任何东西,直接脚本就停了,报错:mysql server has gone away

二、MySQLdb到底该如何获取mysql错误

      既然MySQLdb.ProgrammingError这种方式获取不了mysql报错,那么会不会是用错方法了呢?而且这个MySQLdb.ProgrammingError到底获取的是什么错误,博主也不是很清楚,只知道要用它来捕获错误。既然如此,咱们百度下还有没有其他的方案。

1、网上的方案(亲测可用)

 try:
    conn.ping()			# 尝试数据库重新连接,conn是数据库连接对象,不是cursor对象
except MySQLdb.Error, e:    	# 捕获到错误则打印错误,打印出来的是个数组形式的,可用e[0],e[1]来获取
    print 'error'
    print e

参考: https://blog.youkuaiyun.com/zyz511919766/article/details/20546237

打印结果:

error
(2013, 'Lost connection to MySQL server during query')

      虽然成功捕获了错误,但是为何MySQLdb.ProgrammingError捕获不到呢,为啥代码里用的都是MySQLdb.ProgrammingError呢?很好奇区别到底在哪里。

2、关于MySQLdb.ProgrammingError

      网上查询到了Mysqldb的手册,才知道原来获取mysql错误的方法还是挺多的。比如这个MySQLdb.ProgrammingError,这个捕获的主要是sql的错误,一般是编程错误会引发此异常,例如,当您的SQL中存在语法错误或未找到表时。

      那就怪不得捕获不到mysql的连接上的错误了,这个方法主要捕获sql语句的错误,算是mysql内部的方法,相当于是在连接无误的基础上,捕获sql执行的错误。

关于MySQLdb的相关函数,可以参考手册:
MySQLdb的手册

3、常用的方法如下

MySQLdb.DataError
基数: _mysql_exceptions.DatabaseError

因处理的数据问题(例如被零除,数值超出范围等)引起的错误引发异常。

异常MySQLdb.DatabaseError
基数: _mysql_exceptions.Error

与数据库相关的错误引发异常。

异常MySQLdb.Error
基数: _mysql_exceptions.MySQLError

异常是所有其他错误异常的基类(不是警告)。

异常MySQLdb.ProgrammingError
基数: _mysql_exceptions.DatabaseError

因编程错误而引发的异常,例如,找不到或已经存在表,SQL语句中的语法错误,指定的参数数量错误等。

      我们这里使用的是MySQLdb.Error来捕获错误,相当于是所有的异常,自然是也能捕获到数据库连接失败的错误了。

4、Mysqldb捕获连接错误方法

      回到原来的问题上,我们需要捕获的是mysql server has gone away错误,那么需要的方法如下:

异常MySQLdb.OperationalError
基数: _mysql_exceptions.DatabaseError

因与数据库操作相关且不一定在程序员控制下的错误而引发的异常,例如,发生意外的断开连接,
找不到数据源名称,无法处理事务,在处理期间发生内存分配错误,等等。

      使用这个方法可以直接捕获到断开连接的错误,不管是Lost connection to MySQL server during query 还是mysql server has gone away都当做是断开连接错误,只要捕获到该错误,直接重连即可。

有事没事,多翻手册,果然是有道理的。

end

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 解决 `mysql.connector` 报错方案 当遇到 `mysql.connector` 的报错问题时,可以从多个角度来排查并解决问题。以下是几种常见的错误及其对应的解决方案。 #### 安装与版本兼容性 如果在尝试导入 `mysql.connector` 模块时报错 "No module named mysql.connector" ,这通常意味着该模块未被正确安装或环境配置存在问题[^2]。可以通过以下命令重新安装此库: ```bash pip uninstall mysql-connector-python pip install mysql-connector-python ``` 对于 Python 3.x 用户来说,建议指定最新稳定版以确保最佳兼容性和安全性: ```bash pip install mysql-connector-python==8.0.33 ``` #### 认证插件不支持错误 针对 MySQL 8.0 及以上版本可能出现的认证方式不匹配问题(即 `'caching_sha2_password'`),可以在建立连接前通过修改参数绕过这一障碍[^3]: ```python import mysql.connector config = { 'host': 'localhost', 'database': 'testdb', 'user': 'root', 'password': '', 'auth_plugin':'mysql_native_password' } cnx = mysql.connector.connect(**config) cursor = cnx.cursor() query = ("SELECT * FROM employees LIMIT 1;") cursor.execute(query) for row in cursor: print(row) cursor.close() cnx.close() ``` 上述代码片段展示了如何设置 `auth_plugin='mysql_native_password'` 来规避默认加密算法带来的冲突。 #### 查询执行失败处理 关于 `INSERT INTO ...` 成功而 `SELECT ...` 失败的情况,可能是因为事务隔离级别或其他数据库会话状态的影响所致[^1]。为了防止此类异常发生,在每次操作前后显式管理事务是一个好的实践方法: ```python try: connection.start_transaction(isolation_level="READ COMMITTED") # 执行查询... except Exception as e: connection.rollback() finally: if not connection.is_closed(): connection.commit() connection.close() ``` 此外,还可以考虑增加超时机制以及捕获特定类型的 SQL 错误以便更精确地定位问题所在[^5]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁柱同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值