折腾:
期间,参考别人代码:
<code>def connect(self):
    try:
        self.connection = pymysql.connect(**self.config, cursorclass=pymysql.cursors.DictCursor)
        print("self.connection=%s", self.connection)
        return True
    except mysql.connector.Error as err:
        if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
            print("The credentials you provided are not correct.")
        elif err.errno == errorcode.ER_BAD_DB_ERROR:
            print("The database you provided does not exist.")
        else:
            print("Something went wrong: ", err)
        return False
</code>现在需要:
写对于pymysql.connect,有哪些error,然后去写处理代码,提示用户
pymysql connect error type
python – How to get the MySQL type of error with PyMySQL? – Stack Overflow
“ except pymysql.ProgrammingError:
raise nose.SkipTest(
“Create a group of connection parameters under the heading “
“[pandas] in your system’s mysql default file, “
“typically located at ~/.my.cnf or /etc/.my.cnf. “)
except pymysql.Error:
try:
self.__conn = pymysql.connect( host = host, port = port, user = user, password = password, charset = charset )
except pymysql.Error as e:
print( ‘MySQL?????%d?%s’ % (e.args[ 0 ], e.args[ 1 ]) )
”
ProgrammingError
DataError
IntegrityError
NotSupportedError
OperationalError
好像是:
PEP 249 — Python Database API Specification v2.0 | Python.org
中的:
https://www.python.org/dev/peps/pep-0249/#exceptions
“
StandardError
|__Warning
|__Error
|__InterfaceError
|__DatabaseError
|__DataError
|__OperationalError
|__IntegrityError
|__InternalError
|__ProgrammingError
|__NotSupportedError
”
所以就是:
pymsql中的connect后,得到的是Connection,其遵循PEP 0249:
其中有解释有哪些可能的error
PyCharm中动态代码提示中也可以看到:

所以此处为了简单化,只处理普通的Error即可
然后此处故意没有开mysql的server去测试看看会有什么error
<code>➜ ~ /usr/local/mysql/support-files/mysql.server status SUCCESS! MySQL running (61419) ➜ ~ /usr/local/mysql/support-files/mysql.server stop Shutting down MySQL ... SUCCESS! ➜ ~ /usr/local/mysql/support-files/mysql.server status ERROR! MySQL is running but PID file could not be found ➜ ~ /usr/local/mysql/support-files/mysql.server status ERROR! MySQL is not running </code>
停了mysql server后,去connect,果然是出Connection refused的错:
<code>Connect mysql with config= {'host': '127.0.0.1', 'port': 3306, 'user': 'root', 'password': 'crifan_mysql', 'database': 'AutohomeResultdb', 'charset': 'utf8'}  error= (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 61] Connection refused)")
</code>
然后:
<code>➜ ~ /usr/local/mysql/support-files/mysql.server start Starting MySQL . SUCCESS! ➜ ~ /usr/local/mysql/support-files/mysql.server status SUCCESS! MySQL running (93946) </code>
故意让密码错误试试
<code>Connect mysql with config= {'host': '127.0.0.1', 'port': 3306, 'user': 'root', 'password': 'xxx', 'database': 'AutohomeResultdb', 'charset': 'utf8'}  error= (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
</code>
然后故意数据库的table搞错了试试
<code>Connect mysql with config= {'host': '127.0.0.1', 'port': 3306, 'user': 'root', 'password': 'crifan_mysql', 'database': 'xxxx', 'charset': 'utf8'}  error= (1049, "Unknown database 'xxxx'")
</code>
【总结】
至此,算是基本上明确了pymysql中connect时,如果出现异常,也是Python的PEP 249中的异常,对应类型有:
<code>StandardError |__Warning |__Error |__InterfaceError |__DatabaseError |__DataError |__OperationalError |__IntegrityError |__InternalError |__ProgrammingError |__NotSupportedError </code>
而此处只是简单处理的话,直接只针对pymysql.Error去处理即可:
<code>
import pymysql
import pymysql.cursors
class MysqlDb:
    config = {
        'host': '127.0.0.1',
        'port': 3306,
        'user': 'root',
        'password': 'crifan_mysql',
        'database': 'AutohomeResultdb',
        'charset': "utf8"
    }
    connection = None
    isConnected = False
    def __init__(self):
        """init mysql"""
        if not self.isConnected:
            self.isConnected = self.connect()
            print("Connect mysql return", self.isConnected)
    def connect(self):
        try:
            self.connection = pymysql.connect(**self.config, cursorclass=pymysql.cursors.DictCursor)
            print("connect mysql ok, self.connection=", self.connection)
            return True
        except pymysql.Error as err:
            print("Connect mysql with config=", self.config, " error=", err)
            return False
def test():
    """test mysql"""
    mysqlObj = MysqlDb()
    print("mysqlObj=", mysqlObj)
if __name__ == '__main__':
    test()
</code>然后:
当mysql服务器停止,错误是:2003, “Can’t connect to MySQL server on ‘127.0.0.1’ ([Errno 61] Connection refused)”
当密码出错,错误是:1045, “Access denied for user ‘root’@’localhost’ (using password: YES)”
当数据库名字搞错,出错是:1049, “Unknown database ‘xxxx'”
就基本上足够普通用户清楚到底是哪方面的错误,基本够用了。
转载请注明:在路上 » 【已解决】pymysql中connect异常时有哪些错误类型