PyMySQL无法验证特定用户(MySQLdb成功)

时间:2018-08-14 20:50:11

标签: python-3.x pymysql

使用相同的数据库凭据,MySQLdb会成功通过身份验证,而pymysql不会。仅对一个特定用户会发生这种情况。

>>> import pymysql
>>> import MySQLdb
>>> MySQLdb.connect(**creds)
<_mysql.connection open to 'xxx' at edeae8>
>>> pymysql.connect(**creds)
...
pymysql.err.OperationalError: (1045, "Access denied for user 'xxx'@'10.x.x.x' (using password: YES)")

有人对导致这种情况的原因有任何线索吗?已知pymysql特别对待某些用户名吗?还是无法正确处理密码中的某些字符?

请注意,使用其他凭据可以很好地连接pymysql:

>>> pymysql.connect(**other_creds)
<pymysql.connections.Connection object at 0x7f6991558240>
>>> MySQLdb.connect(**other_creds)
<_mysql.connection open to 'xxx' at edeae8>

很明显,PyMySQL失败的身份验证可以通过我尝试过的所有其他方法成功,包括使用相同凭据对mysql客户端进行命令行调用。

使用Python 3.5.2

2 个答案:

答案 0 :(得分:0)

如果密码包含与数据库URL格式冲突的任何字符,则需要对密码进行URL编码。您在评论中提到的@会出现此问题。

这可以通过urllib.urlencode或等效方法来完成。

答案 1 :(得分:0)

差不多两年后,但我还是会把答案留在这里

此错误已在https://github.com/PyMySQL/PyMySQL/issues/804中报告,标记为“不是错误”并已关闭。 Pymysql是唯一一个不会为您转义字符的库,因此您需要在使用字符串之前将字符串转换为字节,如下所示:

import pymysql.cursors
connection = pymysql.connect(host='127.0.0.1',
                             user='root',
                             password=bytes('my-sécrét-pw', 'utf-8') ,
                             db='dbase')