使用相同的数据库凭据,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
答案 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')