使用 Python,如何捕获 MySQL LOCK 错误但引发所有其他错误?

Using Python, how to you catch MySQL LOCK errors but raise all others?

我正在使用 Python 更新 MySQL 数据库。我的脚本的许多实例一次可以 运行,所以偶尔我会从 MySQL 服务器收到 LOCK 错误消息:

mysql.connector.errors.DatabaseError: 1205 (HY000): 超过锁定等待超时;尝试重新启动事务

如果出现这些情况,我想重试操作。我可以使用基本的 except Exception as e 语句,但这会捕获所有错误,这不是我需要的。

如何只捕获 MySQL 生成的 LOCK 错误?

cursor = mysql.connector.connect(host="myhost.com", user=username, passwd=password, db=schema, auth_plugin='mysql_native_password')

sql = "UPDATE table SET mycolumn = 'mydata'"

while True:
    try:
        cursor.execute(sql)
        break
    except Exception as e:   # I only want to catch LOCK errors here
        print(repr(e))

    except:
        print(sql)
        raise

您可以提取错误代码并根据它执行某些操作。 pymysql 模块的示例,供您使用 - 请参阅文档。

import pymysql
from pymysql.err import DatabaseError

try:
    mydb = pymysql.connect(
        host = "127.0.0.1",
        port = 123123,
        user = "user id",
        password = "!!!!!!!"
        )
except DatabaseError as e:
    err_code = e.args[0]
    if err_code == 2003:
        print('bad connection string')
    else:
        raise

输出:

bad connection string

错误编号为 1205

所以抓住这个号码

import mysql.connector
from mysql.connector import errorcode

cursor = mysql.connector.connect(host="myhost.com", user=username, passwd=password, db=schema, auth_plugin='mysql_native_password')

sql = "UPDATE table SET mycolumn = 'mydata'"

while True:
    try:
        cursor.execute(sql)
        break
        if err.errno == 1205 :
            print("Lock wait timeout exceeded")
        else:
            print(sql)
            raise